深圳幻海软件技术有限公司 欢迎您!

数据结构-顺序栈的基本操作(C语言实现)

2023-04-15

参考书:王道考研数据结构(此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正。如有侵权请告知,马上删除致歉)​​目录一:栈的定义二:常用的基本操作三:操作代码1.栈的顺序存储类型描述2.栈判空     3.初始化一个栈4.进栈5.

参考书:王道考研数据结构

(此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正。如有侵权请告知,马上删除致歉)​​

目录

一:栈的定义

二:常用的基本操作

三:操作代码

1.栈的顺序存储类型描述

2. 栈判空        

3.初始化一个栈

4.进栈

5.出栈

6.读取栈顶元素

7.清空栈

8.销毁栈

9.遍历输出

四:完整代码


一:栈的定义

                栈(Stack)是一种后进先出的线性表,限定这种类型的线性表为只能在某一端进行插入和删除操作。

                基于栈的特性,我们把它称作后进先出表(Last in First out)LIFO。

                常用术语:

                           栈顶(Top):线性表允许插入和删除的那一端。

                           栈底:不可操作的那一端。

                           空栈:不包含任何元素的空表。

二:常用的基本操作

                在国内计算机研究生考试中,如果没有明确规定操作名称,题干没有给出限制,则可以直接使用这些常用操作函数。

                以下是基于严蔚敏版的基本操作:

        InitStack(&S):        初始化一个空表。

        StackEmpty(&S):   判断栈是否为空,若为空则返回true,否则为false。

        Push(&S,x):           进栈,若栈未满,则将新元素插入到S.top+1的位置。

        Pop(&S,&x):          出栈,若栈未空,则将栈顶S.top元素赋值给x,并将Top指针-1。

        GetTop(S,&x) :      读取栈顶元素,若栈未空,将栈顶元素赋值给x

        DestroyStack(&S):销毁栈,并释放栈所用空间。

        ClearStack(&S):    清空栈,将Top指针指向-1的初始化位置。

三:操作代码

1.栈的顺序存储类型描述

  1. #define MaxSize 10
  2. /**
  3. 栈的顺序存储类型描述
  4. 栈顶指针S.top,初始化时设置S.top=-1;
  5. 栈顶元素S.data[S.top];
  6. **/
  7. typedef struct SqStack{
  8. int data[MaxSize];//存放栈元素
  9. int top;//栈顶指针
  10. }SqStack;

2. 栈判空        

  1. /**
  2. 栈判空
  3. **/
  4. bool StackEmpty(SqStack S){
  5. if(S.top==-1) //栈空
  6. return true;
  7. else
  8. return false;
  9. }

功能演示

 

3.初始化一个栈

  1. /**
  2. 初始化一个栈,并将栈顶指针指向-1
  3. */
  4. void InitStack(SqStack &S){
  5. S.top = -1; //初始化栈顶指针
  6. }

4.进栈

  1. /**
  2. 进栈
  3. **/
  4. bool Push(SqStack &S,int x){
  5. if(S.top==MaxSize-1) //栈顶指针指向最后一个,栈满,报错,因为数组下标从0开始,数组下标最大值为Max-1
  6. return false;
  7. S.data[++S.top] = x; //应熟练掌握++i和i++的区别,这里因为top指针指向的是栈目前最后一个元素,需要将指针移到下一个再装填新元素,否则会覆盖,所以使用++S.top
  8. return true;
  9. }

功能演示

 

5.出栈

  1. /**
  2. 出栈
  3. */
  4. bool Pop(SqStack &S,int &x){
  5. if(S.top==-1)
  6. return false;
  7. x = S.data[S.top--]; //将栈顶元素弹出,指针往下-1
  8. return true;
  9. }

功能演示 

6.读取栈顶元素

  1. /**
  2. 读取栈顶元素
  3. */
  4. int GetTop(SqStack S){
  5. if(S.top==-1)
  6. return false;
  7. int x = S.data[S.top];
  8. return x;
  9. }

功能演示

 

7.清空栈

  1. /*
  2. 清空栈
  3. */
  4. bool ClearStack(SqStack &S){
  5. if(S.top==-1)
  6. return false;
  7. S.top=-1; //将栈顶指针指向-1,遍历的时候到top就结束
  8. return true;
  9. }

8.销毁栈

  1. /**
  2. 销毁栈
  3. */
  4. bool DestroyStack(SqStack &S){
  5. if(S.top==-1)
  6. return false;
  7. free(S.data);
  8. return true;
  9. }

9.遍历输出

  1. /**
  2. 遍历输出栈
  3. */
  4. bool PrintStack(SqStack S){
  5. if(S.top==-1){
  6. printf("栈为空");
  7. return false;}
  8. for(int i =0;i<=S.top;i++){
  9. printf(" |%d|\n",S.data[S.top-i]);
  10. }
  11. return true;
  12. }

功能演示

 

四:完整代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. /**********************************************
  4. 制作人:祝星。
  5. 项目名称:数据结构-顺序栈的基本操作(C语言实现)
  6. 完成时间:2022721
  7. 完成内容:栈的定义,创建,判空
  8. 运行环境:win10
  9. 程序环境:VC++
  10. 文件语言:C语言
  11. 文件类型:.cpp
  12. 注:1.VC++的.cpp环境,&为取地址。
  13. ***********************************************/
  14. #define MaxSize 10
  15. /**
  16. 栈的顺序存储类型描述
  17. 栈顶指针S.top,初始化时设置S.top=-1;
  18. 栈顶元素S.data[S.top];
  19. **/
  20. typedef struct SqStack{
  21. int data[MaxSize];//存放栈元素
  22. int top;//栈顶指针
  23. }SqStack;
  24. /**
  25. 栈判空
  26. **/
  27. bool StackEmpty(SqStack S){
  28. if(S.top==-1) //栈空
  29. return true;
  30. else
  31. return false;
  32. }
  33. /**
  34. 初始化一个栈,并将栈顶指针指向-1
  35. */
  36. void InitStack(SqStack &S){
  37. S.top = -1; //初始化栈顶指针
  38. }
  39. /**
  40. 进栈
  41. **/
  42. bool Push(SqStack &S,int x){
  43. if(S.top==MaxSize-1) //栈顶指针指向最后一个,栈满,报错,因为数组下标从0开始,数组下标最大值为Max-1
  44. return false;
  45. S.data[++S.top] = x; //应熟练掌握++i和i++的区别,这里因为top指针指向的是栈目前最后一个元素,需要将指针移到下一个再装填新元素,否则会覆盖,所以使用++S.top
  46. return true;
  47. }
  48. /**
  49. 出栈
  50. */
  51. bool Pop(SqStack &S,int &x){
  52. if(S.top==-1)
  53. return false;
  54. x = S.data[S.top--]; //将栈顶元素弹出,指针往下-1
  55. return true;
  56. }
  57. /**
  58. 读取栈顶元素
  59. */
  60. int GetTop(SqStack S){
  61. if(S.top==-1)
  62. return false;
  63. int x = S.data[S.top];
  64. return x;
  65. }
  66. /*
  67. 清空栈
  68. */
  69. bool ClearStack(SqStack &S){
  70. if(S.top==-1)
  71. return false;
  72. S.top=-1; //将栈顶指针指向-1,遍历的时候到top就结束
  73. return true;
  74. }
  75. /**
  76. 销毁栈
  77. */
  78. bool DestroyStack(SqStack &S){
  79. if(S.top==-1)
  80. return false;
  81. free(S.data);
  82. return true;
  83. }
  84. /**
  85. 遍历输出栈
  86. */
  87. bool PrintStack(SqStack S){
  88. if(S.top==-1){
  89. printf("栈为空");
  90. return false;}
  91. for(int i =0;i<=S.top;i++){
  92. printf(" |%d|\n",S.data[S.top-i]);
  93. }
  94. return true;
  95. }
  96. int main(){
  97. SqStack S;
  98. InitStack(S);
  99. int chose;
  100. int push,pop;
  101. printf("\n---------------------------------------------\n");
  102. printf("请选择功能:\n1:入栈 2:出栈 3:判空 4:读取栈顶元素 4:遍历 6:清空栈 7:销毁栈\n");
  103. scanf("%d",&chose);
  104. while(chose == 0 || chose == 1 ||chose == 2 ||chose == 3 ||chose == 4 ||chose == 5 ||chose == 6 ||chose == 7 ){
  105. switch(chose){
  106. case 0:
  107. scanf("%d",&chose);continue;
  108. case 1:
  109. printf("请输入入栈数:");
  110. scanf("%d",&push);
  111. Push(S,push);
  112. printf("入栈后为:\n");
  113. PrintStack(S);
  114. chose = 0;
  115. break;
  116. case 2:
  117. Pop(S,pop);
  118. printf("将栈顶元素 %d 出栈\n",pop);
  119. printf("出栈后为:\n");
  120. PrintStack(S);
  121. pop = NULL;
  122. chose = 0;
  123. break;
  124. case 3:
  125. if(StackEmpty(S)){
  126. printf("栈空\n");
  127. }else
  128. printf("栈不为空\n");
  129. chose = 0;
  130. break;
  131. case 4:
  132. printf("栈顶元素为%d",GetTop(S));
  133. chose = 0;
  134. break;
  135. case 5:
  136. PrintStack(S);
  137. chose = 0;
  138. break;
  139. case 6:
  140. ClearStack(S);
  141. printf("清空栈\n");
  142. chose = 0;
  143. break;
  144. case 7:
  145. DestroyStack(S);
  146. printf("销毁栈\n");
  147. chose = 0;
  148. break;
  149. }
  150. printf("\n---------------------------------------------\n");
  151. printf("请选择功能:\n1:入栈 2:出栈 3:判空 4:读取栈顶元素 5:遍历 6:清空栈 7:销毁栈\n");
  152. }
  153. return 0;
  154. }

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览44135 人正在系统学习中