[关闭]
@rg070836rg 2015-08-16T15:05:14.000000Z 字数 3982 阅读 1462

顺序栈以及双栈的设计与测试

data_structure

返回目录


一、顺序栈

1、类设计

  1. template<class T,int MAXSIZE>
  2. class SeqStack
  3. {
  4. public:
  5. SeqStack();
  6. ~SeqStack();
  7. private:
  8. T data[MAXSIZE]; //数据域
  9. int top; //栈顶标志
  10. public:
  11. bool Push(T x); //压栈
  12. T Pop(); //出栈
  13. T Top(); //取首元素
  14. bool IsEmpty(); //判空
  15. bool IsFull(void); //判满
  16. int Size(); //返回个数
  17. };

2、具体实现

  1. #include "SeqStack.h"
  2. /**
  3. * 无参数构造函数
  4. * 作用:栈顶置空,生成空栈
  5. * @param[in] 无
  6. * @param[out] 无
  7. */
  8. template<class T, int MAXSIZE>
  9. SeqStack<T,MAXSIZE>::SeqStack()
  10. {
  11. top = -1;
  12. }
  13. /**
  14. * 析构函数
  15. * 作用:垃圾回收
  16. * @param[in] 无
  17. * @param[out] 无
  18. */
  19. template<class T, int MAXSIZE>
  20. SeqStack<T, MAXSIZE>::~SeqStack()
  21. {
  22. }
  23. /**
  24. * 压栈操作
  25. * 作用:将元素压入栈顶
  26. * @param[in] T x
  27. * @param[out] 成功返回true
  28. */
  29. template<class T, int MAXSIZE>
  30. bool SeqStack<T, MAXSIZE>::Push(T x)
  31. {
  32. if (top==MAXSIZE-1)
  33. {
  34. cerr << "上溢" << endl;
  35. return false;
  36. }
  37. top++;
  38. data[top] = x;
  39. return true;
  40. }
  41. /**
  42. * 出栈操作
  43. * 作用:将栈顶元素弹出
  44. * @param[in]
  45. * @param[out]T x
  46. */
  47. template<class T, int MAXSIZE>
  48. T SeqStack<T, MAXSIZE>::Pop()
  49. {
  50. if (!IsEmpty())
  51. {
  52. T x = data[top];
  53. top--;
  54. return x;
  55. }
  56. else
  57. {
  58. cerr << "下溢" << endl;
  59. }
  60. }
  61. /**
  62. * 取出栈顶元素
  63. * 作用:将栈顶元素取出
  64. * @param[in]
  65. * @param[out]T x
  66. */
  67. template<class T, int MAXSIZE>
  68. T SeqStack<T, MAXSIZE>::Top()
  69. {
  70. if (!IsEmpty())
  71. return data[top];
  72. else
  73. cerr << "下溢" << endl;
  74. }
  75. /**
  76. * 判空
  77. * 作用:判断栈是否空
  78. * @param[in]
  79. * @param[out] 布尔值
  80. */
  81. template<class T, int MAXSIZE>
  82. bool SeqStack<T, MAXSIZE>::IsEmpty()
  83. {
  84. return top==-1;
  85. }
  86. /**
  87. * 判空
  88. * 作用:判断栈是否满
  89. * @param[in]
  90. * @param[out] 布尔值
  91. */
  92. template<class T, int MAXSIZE>
  93. bool SeqStack<T, MAXSIZE>::IsFull()
  94. {
  95. return top == maxSize - 1;
  96. }
  97. /**
  98. * 元素个数
  99. * 作用:返回栈元素个数
  100. * @param[in]
  101. * @param[out] 返回元素个数
  102. */
  103. template<class T, int MAXSIZE>
  104. int SeqStack<T, MAXSIZE>::Size()
  105. {
  106. if (top!=-1)
  107. {
  108. return top+1;
  109. }
  110. return 0;
  111. }

3、测试

  1. SeqStack<int,100> a;
  2. //压入数据
  3. for (int i = 0; i < 10; i++)
  4. {
  5. a.Push(i);
  6. }
  7. //栈的大小
  8. cout<< "栈元素个数:"<<a.Size()<<endl;
  9. //栈顶元素
  10. cout << "栈顶元素:" << a.Top() << endl;
  11. //取栈项数据并将数据弹出栈
  12. while (!a.IsEmpty())
  13. {
  14. cout << "顺序出栈:" << a.Pop() << endl;
  15. }

测试截图:
此处输入图片的描述

4、总结

  • 栈(statck)这种数据结构在计算机中是相当出名的。
  • 栈中的数据是先进后出的(FILO)。
  • 根据这个特性,可以很好的利用这种结构。
  • top()、push()、pop()、empty()是比较常用的方法。


二、双栈

1、类设计

  1. template<class T, int MaxSize>
  2. class SeqStack
  3. {
  4. public:
  5. SeqStack(); // 构造函数
  6. virtual ~SeqStack(); // 析构函数
  7. void Push(int i, T x); // 对栈i压栈
  8. T Pop(int i); // 对栈i出栈
  9. T Top(int i); // 取栈i的栈顶元素
  10. int Size(int i); //返回个数
  11. bool IsEmpty(int i); // 判栈i是否空
  12. bool IsFull(); // 判满
  13. private:
  14. T data[MaxSize]; // 数据域
  15. int top1; // 栈顶指针(栈1)
  16. int top2; // 栈顶指针(栈2)
  17. };

2、具体实现

  1. #include "SeqStack.h"
  2. /**
  3. * 无参数构造函数
  4. * 作用:栈顶置空,生成空栈,栈1从头开始,栈2从底开始
  5. * @param[in] 无
  6. * @param[out] 无
  7. */
  8. template<class T, int MaxSize>
  9. SeqStack<T, MaxSize>::SeqStack()
  10. {
  11. top1 = -1;
  12. top2 = MaxSize;
  13. }
  14. /**
  15. * 析构函数
  16. * 作用:垃圾回收
  17. * @param[in] 无
  18. * @param[out] 无
  19. */
  20. template<class T, int MaxSize>
  21. SeqStack<T, MaxSize>::~SeqStack()
  22. {
  23. }
  24. /**
  25. * 压栈操作
  26. * 作用:将元素压入栈顶,根据标志i判断栈号
  27. * @param[in] T x int i
  28. * @param[out]
  29. */
  30. template<class T, int MaxSize>
  31. void SeqStack<T, MaxSize>::Push(int i,T x)
  32. {
  33. if (IsFull())
  34. {
  35. cerr << "上溢!" << endl;
  36. exit(1);
  37. }
  38. if (i == 1)
  39. {
  40. top1++;
  41. data[top1] = x;
  42. }
  43. else if (i == 2)
  44. {
  45. top2--;
  46. data[top2] = x;
  47. }
  48. else
  49. {
  50. cout << "栈选择错误!默认存入栈1" << endl;
  51. top1++;
  52. data[top1] = x;
  53. }
  54. }
  55. /**
  56. * 出栈操作
  57. * 作用:将栈i顶部元素弹出
  58. * @param[in]
  59. * @param[out]T x
  60. */
  61. template<class T, int MaxSize>
  62. T SeqStack<T, MaxSize>::Pop(int i)
  63. {
  64. if (IsEmpty(i))
  65. {
  66. cerr << "下溢!" << endl;
  67. exit(1);
  68. }
  69. T x;
  70. if (i == 1)
  71. {
  72. x = data[top1];
  73. top1--;
  74. }
  75. else if (i == 2)
  76. {
  77. x = data[top2];
  78. top2++;
  79. }
  80. return x;
  81. }
  82. /**
  83. * 取出栈顶元素
  84. * 作用:将栈顶元素取出
  85. * @param[in]
  86. * @param[out]T x
  87. */
  88. template<class T, int MaxSize>
  89. T SeqStack<T, MaxSize>::Top(int i)
  90. {
  91. if (IsEmpty(i))
  92. {
  93. cerr << "下溢!" << endl;
  94. exit(1);
  95. }
  96. if (i == 1)
  97. {
  98. return data[top1];
  99. }
  100. else if (i == 2)
  101. {
  102. return data[top2];
  103. }
  104. }
  105. /**
  106. * 判空
  107. * 作用:判断栈是否空
  108. * @param[in]
  109. * @param[out] 布尔值
  110. */
  111. template<class T, int MaxSize>
  112. bool SeqStack<T, MaxSize>::IsEmpty(int i)
  113. {
  114. if (i == 1)
  115. return top1 == -1;
  116. if (i == 2)
  117. return top2 == MaxSize;
  118. return false;
  119. }
  120. /**
  121. * 判空
  122. * 作用:判断栈是否满
  123. * @param[in]
  124. * @param[out] 布尔值
  125. */
  126. template<class T, int MaxSize>
  127. bool SeqStack<T, MaxSize>::IsFull()
  128. {
  129. return top1 + 1 == top2;
  130. }
  131. /**
  132. * 元素个数
  133. * 作用:返回栈元素个数
  134. * @param[in]
  135. * @param[out] 返回元素个数
  136. */
  137. template<class T, int MAXSIZE>
  138. int SeqStack<T, MAXSIZE>::Size(int i)
  139. {
  140. if (i==1)
  141. {
  142. return top1+1;
  143. }
  144. else if (i==2)
  145. {
  146. return MAXSIZE-top2;
  147. }
  148. else
  149. {
  150. cerr<<"error"<<endl;
  151. exit(1);
  152. }
  153. }

3、测试

  1. int main()
  2. {
  3. SeqStack<int, 100> a;
  4. //压入数据
  5. for (int i=0;i<5;i++)
  6. {
  7. a.Push(1,i);
  8. a.Push(2,10-i);
  9. }
  10. //栈的大小
  11. cout<< "栈1元素个数:"<<a.Size(1)<<endl;
  12. cout<< "栈2元素个数:"<<a.Size(2)<<endl;
  13. //栈顶元素
  14. cout << "栈1栈顶元素:" << a.Top(1) << endl;
  15. cout << "栈2栈顶元素:" << a.Top(2) << endl;
  16. // 出栈
  17. while (!a.IsEmpty(1))
  18. {
  19. cout << "栈1出栈:" << a.Pop(1) << endl;
  20. }
  21. while (!a.IsEmpty(2))
  22. {
  23. cout << "栈2出栈:" << a.Pop(2) << endl;
  24. }
  25. return 0;
  26. }

测试截图:
此处输入图片的描述
错误测试:

  1. //错误数据的测试
  2. a.Push(3,10);
  3. a.Push(3,11);

![此处输入图片的描述][4]

4、总结

  • 与数组单栈相比,双栈更加节省空间
  • 注意错误情况的处理

[4glb.clouddn.com/%E5%8F%8C%E6%A0%8801.png

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注