数据结构——基本栈的模板类

心已赠人 2022-06-07 02:57 343阅读 0赞

数据结构笔记
这篇文章主要是给出栈的基本操作的代码(如: POP、PUSH等),是一个最基本的栈的模板类。

  1. #include <iostream>
  2. #include <cassert>
  3. #include "stack.h"
  4. using namespace std;
  5. const int stackIncreament = 20; //栈溢出时扩展空间的增量
  6. template<class T>
  7. class SeqStack :public Stack<T> {
  8. public:
  9. SeqStack(int sz = 50); //建立一个空栈
  10. ~SeqStack(); //析构函数
  11. void Push(const T & x); //如果IsFull则溢出处理,否则把x推入栈顶
  12. bool Pop(T & x); //如果IsEmpty则不执行,返回false,否则推掉栈顶元素并返回true
  13. //推出元素值通过引用参数x返回
  14. bool getTop(T & x)const; //如果栈为NULL则返回false,否则返回true,栈顶元素的值通过x传回
  15. bool IsEmpty()const; //如果栈中元素等于0个返回true,否则返回false
  16. bool IsFull()const; //如果栈中元素等于maxSize,返回true,否则返回false
  17. int getSize()const; //返回栈中元素的个数
  18. void makeEmpty(); //清空栈的内容
  19. void output(ostream & os);
  20. private:
  21. T *elements; //存放栈中元素的栈数组
  22. int top; //标记栈的top
  23. int maxSize; //栈的最大能容元素的个数
  24. void overflowProcess(); //栈的溢出处理
  25. };
  26. template<class T>
  27. void SeqStack<T>::output(ostream & os) {
  28. os << "top = " << top << endl;
  29. for (int i = 0; i <= top; i++) {
  30. os << i << ":" << elements[i] << endl;
  31. }
  32. }
  33. template<class T>
  34. ostream & operator << (ostream & os, SeqStack<T> & s) {
  35. s.output(os);
  36. return os;
  37. }
  38. template<class T>
  39. SeqStack<T>::~SeqStack() {
  40. delete[] elements;
  41. }
  42. template<class T>
  43. bool SeqStack<T>::IsEmpty() const {
  44. //判断是否为NULL
  45. if (-1 == top) {
  46. return true;
  47. }
  48. else {
  49. return false;
  50. }
  51. }
  52. template<class T>
  53. bool SeqStack<T>::IsFull() const {
  54. //判断栈是否FULL
  55. if (maxSize - 1 == top) {
  56. return true;
  57. }
  58. else {
  59. return false;
  60. }
  61. }
  62. template<class T>
  63. void SeqStack<T>::makeEmpty() {
  64. //清空栈
  65. top = -1;
  66. }
  67. template<class T>
  68. int SeqStack<T>::getSize()const {
  69. return top + 1;
  70. }
  71. template<class T>
  72. SeqStack<T>::SeqStack(int sz) {
  73. top = -1;
  74. maxSize = sz;
  75. //建立一个最大尺寸为sz的空栈,若分配不成功则错误处理
  76. elements = new T[maxSize]; //创建栈的数组空间
  77. assert(elements != NULL); //断言:动态存储分配是否成功
  78. }
  79. template<class T>
  80. void SeqStack<T>::overflowProcess() {
  81. //私有函数:扩充栈的存储空间
  82. T * newArray = new T[maxSize + stackIncreament];
  83. if (NULL == newArray) {
  84. cerr << "内存分配错误" << endl;
  85. exit(1);
  86. }
  87. for (int i = 0; i <= top; i++) {
  88. newArray[i] = elements[i]; //将原来栈中的数据逐一copy
  89. }
  90. maxSize += stackIncreament; //更新栈的最大容量
  91. delete[] elements; //释放原来的指针
  92. elements = newArray; //更新原来的指针
  93. }
  94. template<class T>
  95. void SeqStack<T>::Push(const T& x) {
  96. //若栈不满,则将元素x推入栈顶位置,否则溢出处理
  97. if (IsFull()) {
  98. overflowProcess(); //检测到栈满,扩充栈的容量
  99. }
  100. elements[++top] = x; //先执行top+1,后元素进栈
  101. }
  102. template<class T>
  103. bool SeqStack<T>::Pop(T & x) {
  104. //若栈不空则函数返回栈顶的值,并将栈顶元素弹出
  105. if (IsEmpty()) {
  106. return false;
  107. }
  108. x = elements[top--]; //top-1实现pop栈顶元素
  109. return true;
  110. }
  111. template<class T>
  112. bool SeqStack<T>::getTop(T &x)const {
  113. //若栈不空,则函数返回栈顶元素
  114. if (IsEmpty()) {
  115. return false;
  116. }
  117. x = elements[top];
  118. return true;
  119. }
  120. int main()
  121. {
  122. int pop1, pop2;
  123. SeqStack<int> stackTest;
  124. stackTest.Push(1);
  125. stackTest.Push(2);
  126. stackTest.Push(2);
  127. stackTest.Push(2);
  128. stackTest.Push(5);
  129. cout << stackTest;
  130. stackTest.Pop(pop1);
  131. stackTest.Pop(pop2);
  132. cout << stackTest;
  133. cout << stackTest.getSize() << endl;
  134. int top;
  135. stackTest.getTop(top);
  136. cout << top << endl;
  137. system("pause");
  138. return 0;
  139. }

运行测试:这里写图片描述
在写这部分程序中,应该注意的是对输出操作符的重载,在涉及友元函数及其它方式时应该注意的问题,之后会有相应的总结。

发表评论

表情:
评论列表 (有 0 条评论,343人围观)

还没有评论,来说两句吧...

相关阅读

    相关 3.基本数据结构-

    一.线性数据结构   - 我们从四个简单但重要的概念开始研究数据结构。栈,队列,deques(双向队列), 列表是一类数据的容器,它们数据元素之间的顺序由添加或删除的顺序决定

    相关 数据结构-“基本操作

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(