当前位置:   article > 正文

顺序栈——栈的顺序表示和实现_序列xyz按顺序进栈的方法

序列xyz按顺序进栈的方法

顺序表表示的栈的基本操作代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #define SElemType int
  4. #define Status int
  5. #define STACK_INIT_SIZE 100 //初始空间分配量
  6. #define STACKINCREMENT 10 //存储空间分配增量
  7. using namespace std;
  8. //栈的结构
  9. typedef struct {
  10. SElemType *base; //栈底指针,在栈结构不存在(构造之前和销毁之后),base的值为NULL
  11. SElemType *top; //栈顶指针,非空栈的栈顶指针始终在栈顶元素的的下一个位置上
  12. int stacksize; //可存储的最大容量,即最多存储的元素个数
  13. }SqStack;
  14. //初始化栈
  15. /**
  16. 说明,这里使用C语言的malloc和realloc
  17. 除此之外,还可以使用c++的new运算符( S.base = new SElemType[MAXSIZE];)
  18. 但是,new运算符在给定一个定长数组初始化后,长度变不能改变(c++没有realloc函数)
  19. 改进有两个方法,
  20. (1)、在初始化时,使用vector变长数组代替数组
  21. (2)、新建一个更大的数组,将原有的元素复制过去(realloc就是这个原理)
  22. */
  23. Status InitStack(SqStack &S){
  24. S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  25. if(!S.base){ //动态空间分配失败
  26. printf("动态空间分配失败\n");
  27. return 0;
  28. }
  29. S.top = S.base; //栈顶指针初值指向栈底,即top=base表示空栈
  30. S.stacksize = STACK_INIT_SIZE; //标记空间大小
  31. printf("初始化成功\n");
  32. return 0;
  33. }
  34. //入栈
  35. Status Push(SqStack &S, SElemType e){
  36. //判断栈是否满;
  37. if(S.top-S.base >= S.stacksize){ //栈满,追加
  38. S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
  39. if(!S.base){
  40. printf("动态空间分配失败\n");
  41. return 0;
  42. }
  43. S.top = S.base+S.stacksize; //更新栈顶元素指针
  44. S.stacksize += STACKINCREMENT; //更新最大容量
  45. }
  46. *S.top++ = e; //插入到栈顶并将栈顶指针加一
  47. printf("插入成功\n");
  48. return 0;
  49. }
  50. //创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
  51. void Creat(SqStack &S,int n){
  52. InitStack(S);
  53. for(int i=0;i<n;i++){
  54. int e;
  55. scanf("%d",&e);
  56. Push(S,e);
  57. }
  58. printf("创建成功\n");
  59. }
  60. //获取元素个数
  61. Status StackLength(SqStack S){
  62. int count = S.top-S.base;
  63. return count;
  64. }
  65. //判断栈空
  66. bool StackEmpty(SqStack S){
  67. if(S.base == S.top){
  68. printf("栈为空\n");
  69. return true;
  70. }else{
  71. printf("栈不为空\n");
  72. return false;
  73. }
  74. }
  75. //获取栈顶元素
  76. Status GetTop(SqStack S,SElemType e){
  77. //若栈不为空
  78. if(!StackEmpty(S)){
  79. e = *(S.top-1);
  80. printf("栈顶元素值为:%d\n",e);
  81. }
  82. return 0;
  83. }
  84. //出栈
  85. Status Pop(SqStack &S,SElemType e){
  86. //判断栈空
  87. if(!StackEmpty(S)){
  88. e = *--S.top;
  89. printf("栈顶元素%d出栈成功\n",e);
  90. }
  91. return 0;
  92. }
  93. //遍历--从栈底到栈顶的元素输出
  94. Status StackTraverse(SqStack S){
  95. printf("遍历开始:\n");
  96. for(SElemType *i=S.base;i<S.top;i++){ //从底部开始,到栈顶的前一个停止
  97. printf("%d ",*i);
  98. }
  99. printf("\n");
  100. }
  101. //置空
  102. Status ClearStack(SqStack &S){
  103. S.top = S.base; //不能写成S.base = S.top; 位置不能反了
  104. printf("置空成功\n");
  105. return 0;
  106. }
  107. //销毁
  108. Status DestoryStack(SqStack &S){
  109. free(S.base); //销毁连续空间
  110. S.base = NULL; //底指针指针赋空
  111. S.top = NULL; //栈栈顶指针赋空
  112. S.stacksize = 0; //栈最大容量置为0
  113. printf("销毁成功");
  114. return 0;
  115. }
  116. int main(){
  117. int n,value1,value2;
  118. SqStack S;
  119. printf("请输入元素个数");
  120. scanf("%d",&n);
  121. Creat(S,n);
  122. printf("栈中元素的个数为%d\n",StackLength(S));
  123. Pop(S,value2);
  124. GetTop(S,value1);
  125. StackTraverse(S);
  126. ClearStack(S);
  127. StackEmpty(S);
  128. DestoryStack(S);
  129. return 0;
  130. }
'
运行

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

闽ICP备14008679号