• C++ 手动实现栈(stack) (课后作业版)


    栈,一种遵循先进先出原则的数据结构,可以用顺序表实现,也可以用链表进行实现。

    这里我使用数组实现方法,包含了进栈,出栈,访问栈顶等功能,以及一些辅助功能。

    栈Stack类定义如下:

    1. template <typename T>
    2. class Stack {
    3. public:
    4. Stack();
    5. Stack(int n);
    6. Stack(Stack& stack);
    7. ~Stack();
    8. T& top();
    9. Stack& push(const T& elem);
    10. Stack& pop();
    11. void reserve(int num);
    12. int size() {return current+1; }
    13. int capciaty() {return cap; }
    14. int is_empty() {return current == -1; }
    15. bool is_full() {return current == (cap-1); }
    16. void clear() {this->~Stack();}
    17. private:
    18. T* arr;
    19. int current;
    20. int cap;
    21. };

    其中,成员变量的解释:

    arr :数组指针,指向栈底

    current : 当前栈顶的索引,没有元素的时候为-1, 有一个元素的时候为0, 以此类推

    cap :数组容量,注意容量和元素个数是不同的概念

    然后,是成员函数的解释:

    Stack();    默认构造函数
    Stack(int n);    一般构造函数,容量为n
    Stack(Stack& stack);    拷贝构造函数,浅拷贝
    ~Stack();       析构函数
    T& top();      访问栈顶
    Stack& push(const T& elem);    进栈
    Stack& pop();    出栈
    void reserve(int num);    增加容量
    int size() {return current+1; }    获取当前元素个数
    int capciaty() {return cap; }     获取容量
    int is_empty() {return current == -1; }   是否为空栈
    bool is_full() {return current == (cap-1); }    是否满栈
    void clear() {this->~Stack();}    清除,调用析构函数

    完成实现代码:

    1. #include
    2. using namespace std;
    3. template <typename T>
    4. class Stack {
    5. public:
    6. Stack();
    7. Stack(int n);
    8. Stack(Stack& stack);
    9. ~Stack();
    10. T& top();
    11. Stack& push(const T& elem);
    12. Stack& pop();
    13. void reserve(int num);
    14. int size() {return current+1; }
    15. int capciaty() {return cap; }
    16. int is_empty() {return current == -1; }
    17. bool is_full() {return current == (cap-1); }
    18. void clear() {this->~Stack();}
    19. private:
    20. T* arr;
    21. int current;
    22. int cap;
    23. };
    24. //默认构造函数
    25. template <typename T>
    26. Stack::Stack() {
    27. cap = 0;
    28. current = -1;
    29. arr = nullptr;
    30. }
    31. //一般构造函数
    32. template <typename T>
    33. Stack::Stack(int n) {
    34. cap = n;
    35. current = -1;
    36. arr = new T[n]{};
    37. }
    38. //拷贝构造函数(前浅贝)
    39. template <typename T>
    40. Stack::Stack(Stack& stack) {
    41. cap = stack.capciaty();
    42. current = stack.size();
    43. this->arr = stack.arr;
    44. }
    45. //析构函数
    46. template <typename T>
    47. Stack::~Stack() {
    48. if ( cap == 0 ) {
    49. return;
    50. }
    51. cap = 0;
    52. current = -1;
    53. delete [] arr;
    54. arr = nullptr;
    55. }
    56. //访问栈顶
    57. template <typename T>
    58. T& Stack::top() {
    59. if ( is_empty() ) {
    60. cout << "[error]: stack has no element" << endl;
    61. }
    62. return *(arr+current);
    63. }
    64. //在栈顶添加一个元素
    65. template <typename T>
    66. Stack& Stack::push(const T& elem) {
    67. if ( is_full() ) {
    68. reserve(2*cap);
    69. }
    70. current++;
    71. arr[current] = elem;
    72. return *this;
    73. }
    74. //栈顶弹出
    75. template <typename T>
    76. Stack& Stack::pop() {
    77. if ( is_empty() ) {
    78. cout << "[error]: don't try to pop a empty stack" << endl;
    79. return *this;
    80. }
    81. current--;
    82. return *this;
    83. }
    84. //增加容量
    85. template <typename T>
    86. void Stack::reserve(int num) {
    87. if ( num < cap ) {
    88. cout << "[warning]: input of reserve() function shuold lager than capciaty" << endl;
    89. return;
    90. }
    91. T *arr_ = new T[num]{};
    92. for ( int i = 0; i <= current; i++ )
    93. arr_[i] = arr[i];
    94. delete [] arr;
    95. arr = arr_;
    96. arr_ = nullptr;
    97. cap = num;
    98. }
    99. int main() {
    100. Stack<int> stack(3);
    101. // cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    102. stack.push(3);
    103. cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    104. stack.push(2);
    105. cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    106. stack.push(5);
    107. cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    108. stack.push(5);
    109. cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    110. stack.pop();
    111. cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    112. stack.clear();
    113. cout << "top=" << stack.top() << ", 容量=" << stack.capciaty() << ", 元素个数=" << stack.size() << endl;
    114. }

  • 相关阅读:
    ESP8266-Arduino编程实例-MQ-4气体传感器驱动
    静态语言和动态语言,解释和编译
    Vue常用的组件库大全【前端工程师必备】
    Vue框架实现对前端数据表的增删改查(第六课)
    Android系统中Linux用户权限信息在哪里配置?
    4 款适用于 Windows 的最佳免费 GIS 软件
    LVI-SAM:配置环境、安装测试、适配自己采集数据集
    使用Locust进行接口性能测试:安装、命令参数解析与示例解读
    电磁场中的几种阻抗
    Pandas中at、iat函数详解
  • 原文地址:https://blog.csdn.net/a1367666195/article/details/128022702