当前位置:   article > 正文

C++的数据结构(三):栈

C++的数据结构(三):栈

        栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它只允许在一端(称为栈顶)进行插入和删除操作。栈的这种特性使得它在解决函数调用、括号匹配、表达式求值等问题时具有天然的优势。在C++中,栈可以通过标准库中的`std::stack`模板类来实现,也可以手动使用数组或链表等数据结构来实现。

        根据底层实现的不同,栈可以分为静态栈和动态栈。静态栈是在编译时确定其大小,通常使用数组来实现;动态栈则是在运行时动态分配内存,大小可以随需调整,通常使用链表或动态数组来实现。

        基于数组的栈通常包括以下几个部分:

        1. 一个数组,用于存储栈中的元素。
        2. 一个整型变量,用于记录栈顶元素的位置(通常指向栈顶元素的下一个位置)。

        当进行入栈操作时,将元素放入数组的末尾,并更新栈顶位置;当进行出栈操作时,从数组的末尾移除元素,并更新栈顶位置。

        下面是一个简单的基于数组的栈操作的C++实现:

  1. #include <iostream>
  2. #include <vector>
  3. #include <stdexcept>
  4. using namespace std;
  5. template <typename T>
  6. class ArrayStack {
  7. private:
  8. vector<T> elements;
  9. public:
  10. // 判断栈是否为空
  11. bool isEmpty() const {
  12. return elements.empty();
  13. }
  14. // 获取栈的大小
  15. size_t size() const {
  16. return elements.size();
  17. }
  18. // 入栈操作
  19. void push(const T& value) {
  20. elements.push_back(value);
  21. }
  22. // 出栈操作
  23. void pop() {
  24. if (isEmpty()) {
  25. throw out_of_range("Stack is empty!");
  26. }
  27. elements.pop_back();
  28. }
  29. // 获取栈顶元素
  30. T& top() {
  31. if (isEmpty()) {
  32. throw out_of_range("Stack is empty!");
  33. }
  34. return elements.back();
  35. }
  36. // 获取栈顶元素(常量版本)
  37. const T& top() const {
  38. if (isEmpty()) {
  39. throw out_of_range("Stack is empty!");
  40. }
  41. return elements.back();
  42. }
  43. };
  44. int main() {
  45. ArrayStack<int> stack;
  46. // 入栈操作
  47. stack.push(1);
  48. stack.push(2);
  49. stack.push(3);
  50. // 输出栈的大小
  51. cout << "Size of stack: " << stack.size() << std::endl;
  52. // 输出栈顶元素
  53. cout << "Top element: " << stack.top() << std::endl;
  54. // 出栈操作
  55. stack.pop();
  56. stack.pop();
  57. // 再次输出栈顶元素
  58. cout << "Top element after popping: " << stack.top() << std::endl;
  59. return 0;
  60. }

        结果如下所示:

           在这个例子中,我们使用`vector`作为底层数组来实现栈。`push`方法用于入栈操作,将元素添加到数组的末尾;`pop`方法用于出栈操作,移除数组的最后一个元素;`top`方法用于获取栈顶元素。此外,我们还提供了`isEmpty`和`size`方法来检查栈是否为空以及获取栈的大小。在`main`函数中,我们展示了如何使用这个基于数组的栈类进行基本的栈操作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/575522
推荐阅读
相关标签
  

闽ICP备14008679号

        
cppcmd=keepalive&