当前位置:   article > 正文

C++ 栈的基础操作_销毁栈s,s不再存在

销毁栈s,s不再存在

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include <iostream>
  4. using namespace std;
  5. // 函数结果状态代码
  6. #define TRUE 1
  7. #define FALSE 0
  8. #define OK 1
  9. #define ERROR 0
  10. #define OVERFLOW -1
  11. #define STACK_INIT_SIZE 100 //存储空间初始分配量
  12. #define STACKINCREMENT 10 //存储空间分配增量
  13. typedef int SElemType; // 定义栈元素类型为整型
  14. /* 顺序栈类型定义 */
  15. typedef struct
  16. {
  17. SElemType *base; //栈的基址即栈底指针
  18. SElemType *top; //栈顶指针
  19. int stacksize; //当前分配的空间
  20. }SqStack;
  21. void input(SElemType &s);
  22. void output(SElemType s);
  23. void InitStack(SqStack &S);// 构造一个空栈S
  24. void DestroyStack(SqStack &S); // 销毁栈S,S不再存在
  25. void ClearStack(SqStack &S); // 把S置为空栈
  26. int StackEmpty(SqStack S); // 若栈S为空栈,则返回TRUE,否则返回FALSE
  27. int StackLength(SqStack S); // 返回S的元素个数,即栈的长度
  28. int GetTop(SqStack S,SElemType &e); // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  29. void Push(SqStack &S,SElemType e); // 插入元素e为新的栈顶元素
  30. int Pop(SqStack &S,SElemType &e); // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  31. void StackTraverse(SqStack S,void(*visit)(SElemType)); // 从栈底到栈顶依次对栈中每个元素调用函数visit()
  32. int main()
  33. {
  34. int j;
  35. SqStack s;
  36. SElemType e;
  37. InitStack(s);
  38. int i;
  39. cin>>i;
  40. for(j=0;j<i;j++)
  41. {
  42. input(e);
  43. Push(s,e);
  44. }
  45. printf("栈中元素依次为:");
  46. StackTraverse(s,output);
  47. Pop(s,e);
  48. printf("弹出的栈顶元素 e=%d\n",e);
  49. printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
  50. GetTop(s,e);
  51. printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
  52. ClearStack(s);
  53. printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
  54. DestroyStack(s);
  55. printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
  56. }
  57. /*****SElemType类型元素的基本操作*****/
  58. void input(SElemType &s)
  59. {
  60. cin>>s;
  61. }
  62. void output(SElemType s)
  63. {
  64. cout<<s<<" ";
  65. }
  66. /*****顺序栈的基本操作*****/
  67. void InitStack(SqStack &S)
  68. {
  69. // 构造一个空栈S
  70. /********** Begin **********/
  71. if (!(S.base = (SElemType*)malloc(STACK_INIT_SIZE *
  72. sizeof(SElemType))))
  73. exit(OVERFLOW);
  74. S.top = S.base;
  75. S.stacksize = STACK_INIT_SIZE;
  76. /********** End **********/
  77. }
  78. void DestroyStack(SqStack &S)
  79. {
  80. // 销毁栈S,S不再存在
  81. /********** begin**********/
  82. free(S.base);
  83. S.base = NULL;
  84. S.top = NULL;
  85. S.stacksize = 0;
  86. /********** End **********/
  87. }
  88. void ClearStack(SqStack &S)
  89. {
  90. // 把S置为空栈
  91. /********** Begin **********/
  92. if(StackEmpty(S))
  93. return ;
  94. else
  95. S.top = S.base;
  96. /********** End **********/
  97. }
  98. int StackEmpty(SqStack S)
  99. {
  100. // 若栈S为空栈,则返回TRUE,否则返回FALSE
  101. /********** Begin **********/
  102. if (S.top == S.base)
  103. return TRUE;
  104. else
  105. return FALSE;
  106. /********** End **********/
  107. }
  108. int StackLength(SqStack S)
  109. {
  110. // 返回S的元素个数,即栈的长度
  111. /********** Begin **********/
  112. return S.top - S.base;
  113. /********** End **********/
  114. }
  115. int GetTop(SqStack S,SElemType &e)
  116. {
  117. // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  118. /********** Begin **********/
  119. if (S.top > S.base)//非空时
  120. {
  121. e = *(S.top - 1);//先-1,后取内容,指针不对
  122. return OK;
  123. }
  124. else
  125. return ERROR;
  126. /********** End **********/
  127. }
  128. void Push(SqStack &S,SElemType e)
  129. {
  130. // 插入元素e为新的栈顶元素
  131. /********** Begin **********/
  132. if (S.top - S.base >= S.stacksize)//考虑满问题
  133. {
  134. if (!(S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT ) * sizeof(SElemType))))
  135. exit(OVERFLOW);
  136. S.top = S.base + S.stacksize;//栈顶移动
  137. S.stacksize += STACKINCREMENT ;
  138. }
  139. *(S.top)++ = e; //先放元素,然后+1移动
  140. /********** End **********/
  141. }
  142. int Pop(SqStack &S,SElemType &e)
  143. {
  144. // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  145. /********** Begin **********/
  146. if (S.top == S.base)
  147. return ERROR;
  148. e = *--S.top;//先-1,后取内容
  149. return OK;
  150. /********** End **********/
  151. }
  152. void StackTraverse(SqStack S,void(*visit)(SElemType))
  153. {
  154. // 从栈底到栈顶依次对栈中每个元素调用函数visit()
  155. /********** Begin **********/
  156. if (!StackEmpty(S))
  157. for(SElemType *p=S.base;p<S.top;p++)
  158. visit(*p);
  159. printf("\n") ;
  160. /********** End **********/
  161. }

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

闽ICP备14008679号