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

栈的基本操作(详细)

2023-04-02

本文章会详细介绍栈的基本操作目录1.本文章中全部实现的功能2.建栈3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)4.进栈5.弹栈,并且返回出弹栈元素6.栈内元素的个数7.按栈输入的顺序输出栈里面的值8.按栈弹出的顺序输出栈9.判断栈是否为空10.获取栈顶元素11.清空一个栈12

本文章会详细介绍栈的基本操作

目录

1.本文章中全部实现的功能

2.建栈

3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)

4.进栈

5.弹栈,并且返回出弹栈元素

6.栈内元素的个数

7.按栈输入的顺序输出栈里面的值

8.按栈弹出的顺序输出栈

9.判断栈是否为空

10.获取栈顶元素

11.清空一个栈

12.摧毁一个栈

13.switch功能语句

14.全部代码

15.运行结果


1.本文章中全部实现的功能

        栈的特点,先进后出。

  1. void program()
  2. {
  3. printf("\t请输入以下功能数字\n");
  4. printf("\t0.退出\n");
  5. printf("\t1.判断栈是否为空\n");
  6. printf("\t2.按栈弹出的顺序输出栈\n");
  7. printf("\t3.按栈输入的顺序输出栈里面的值\n");
  8. printf("\t4.获取栈顶元素\n");
  9. printf("\t5.摧毁一个栈\n");
  10. printf("\t6.清空一个栈\n");
  11. printf("\t7.求栈的长度\n");
  12. printf("\t8.弹栈,并且返回出弹栈元素\n");
  13. printf("\t9.输入栈内数据\n");
  14. printf("\t10.在清空的基础下重新建立栈\n");
  15. printf("\t11.请输入想要插入栈顶的元素\n");
  16. }

2.建栈

  1. Status InitStack(SqStack &S)
  2. {
  3. //建栈
  4. S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
  5. if(!S.base) exit(OVERFLOW);
  6. S.top=S.base;
  7. S.stacksize=Stack_Init_Size;
  8. return OK;
  9. }

3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)

  1. SqStack InputStack(SqStack &S)
  2. {
  3. int a;
  4. /*scanf("%d",&a);
  5. while(a!=-1)
  6. {
  7. if(S->top-S->base>S->stacksize)
  8. {
  9. S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
  10. if(!S->base) printf("NoRealloc\n");
  11. S->top=S->base+S->stacksize;
  12. S->stacksize=S->stacksize+Stack_Increment;
  13. }
  14. *S->top++ = a;
  15. scanf("%d",&a);
  16. }*/
  17. InitStack(S);
  18. printf("\t");
  19. for(int i=0;;i++){
  20. scanf("%d",&a);
  21. if(a==-1)break;
  22. *S.top++ =a;
  23. }
  24. printf("\t写入完成\n");
  25. }

4.进栈

        如果栈的内容小于输入内容不需要扩展直接*S.top++=e;但是当内容大于了栈的内容。就进入if语句。

  1. Status Push(SqStack &S,int e)
  2. {
  3. //进栈
  4. if(S.top-S.base>S.stacksize)
  5. {
  6. S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
  7. if(!S.base) printf("NoRealloc\n");
  8. S.top=S.base+S.stacksize;
  9. S.stacksize=S.stacksize+Stack_Increment;
  10. }
  11. *S.top++=e;
  12. return OK;
  13. }

5.弹栈,并且返回出弹栈元素

  1. Status Pop(SqStack &S,int *e)
  2. {
  3. //弹栈,并且返回出弹栈元素
  4. *e=*--S.top;
  5. return OK;
  6. }

6.栈内元素的个数

  1. Status StackLength(SqStack S)
  2. {
  3. //栈长
  4. int Length=S.top-S.base;
  5. printf("\tlength = %d\n",Length);
  6. return Length;
  7. }

7.按栈输入的顺序输出栈里面的值

  1. void PrintStack_int(SqStack S)
  2. {
  3. //按栈输入的顺序输出栈里面的值
  4. int *p=S.base;
  5. while(p!=S.top)
  6. {
  7. printf("\t");
  8. printf(" %d ",*p);
  9. p++;
  10. }
  11. printf("\n");
  12. }

8.按栈弹出的顺序输出栈

  1. void PrintStack_Pop(SqStack S)
  2. {
  3. //按栈弹出的顺序输出栈
  4. int *p=S.top-1;
  5. while(p!=S.base-1)
  6. {
  7. printf("\t");
  8. printf(" %d ",*p);
  9. p--;
  10. }
  11. printf("\n");
  12. }

9.判断栈是否为空

  1. void IsNullStack(SqStack S)
  2. {
  3. //判断栈是否为空
  4. if(S.base==S.top||S.base==NULL)
  5. printf("\t栈为空栈\n");
  6. else
  7. printf("\t栈不为空\n");
  8. }

10.获取栈顶元素

  1. Status GetTop(SqStack S)
  2. {
  3. //获取栈顶元素
  4. int e;
  5. e=*(S.top-1);
  6. printf("\t栈顶元素为%d\n",e);
  7. }

11.清空一个栈

  1. void ClearStack(SqStack &S)
  2. {
  3. //清空一个栈
  4. S.top=S.base;
  5. }

12.摧毁一个栈

  1. void DestroyStack(SqStack &S)
  2. {
  3. //摧毁一个栈
  4. free(S.base);
  5. S.base=S.top;
  6. S.stacksize=0;
  7. S.top=NULL;
  8. S.base=NULL;
  9. }

13.switch功能语句

  1. void swi(SqStack S){
  2. int num;
  3. program();
  4. printf("\t输入的元素是:");
  5. scanf("%d",&num);
  6. printf("\n\n");
  7. while(num)
  8. {
  9. switch(num)
  10. {
  11. case 0:
  12. num=0;
  13. break;
  14. case 1:
  15. if(S.base==NULL){
  16. printf("\t在进行操作1之前需要操作功能9\n");
  17. }else{
  18. printf("\t判断栈是否为空\n");
  19. IsNullStack(S);
  20. }
  21. break;
  22. case 2:
  23. if(S.base==NULL){
  24. printf("\t在进行操作2之前需要操作功能9\n");
  25. }else{
  26. printf("\t2.按栈弹出的顺序输出栈\n");
  27. PrintStack_Pop(S);
  28. }
  29. break;
  30. case 3:
  31. if(S.base==NULL){
  32. printf("\t在进行操作3之前需要操作功能9\n");
  33. }else{
  34. printf("\t3.按栈输入的顺序输出栈里面的值\n");
  35. PrintStack_int(S);
  36. }
  37. break;
  38. case 4:
  39. if(S.base==NULL){
  40. printf("\t在进行操作4之前需要操作功能9\n");
  41. }else{
  42. printf("\t4.获取栈顶元素\n");
  43. GetTop(S);
  44. }
  45. break;
  46. case 5:
  47. if(S.base==NULL){
  48. printf("\t在进行操作5之前需要操作功能9\n");
  49. }else{
  50. printf("\t5.摧毁一个栈\n");
  51. DestroyStack(S);
  52. printf("\t栈已经被摧毁\n");
  53. }
  54. break;
  55. case 6:
  56. if(S.base==NULL){
  57. printf("\t在进行操作6之前需要操作功能9\n");
  58. }else{
  59. printf("\t6.清空一个栈\n");
  60. ClearStack(S);
  61. printf("\t栈已经清空");
  62. }
  63. break;
  64. case 7:
  65. if(S.base==NULL){
  66. printf("\t在进行操作7之前需要操作功能9\n");
  67. }else{
  68. printf("\t7.求栈的长度\n");
  69. StackLength(S);
  70. }
  71. break;
  72. case 8:
  73. if(S.base==NULL){
  74. printf("\t在进行操作8之前需要操作功能9\n");
  75. }else{
  76. printf("\t弹栈,并且返回出弹栈元素\n");
  77. int a;
  78. Pop(S,&a);
  79. printf("\t8.弹栈弹出的元素是%d\n",a);
  80. }
  81. break;
  82. case 9:
  83. printf("\t9.输入栈内数据\n");
  84. InputStack(S);
  85. break;
  86. case 10:
  87. if(S.base==NULL){
  88. printf("\t在进行操作10之前需要操作功能9\n");
  89. }else{
  90. printf("\t10.在清空的基础下重新建立栈\n");
  91. DestroyStack(S);
  92. printf("\t请重新输入栈内数据\n");
  93. InputStack(S);
  94. }
  95. break;
  96. case 11:
  97. if(S.base==NULL){
  98. printf("\t在进行操作11之前需要操作功能9\n");
  99. }else{
  100. printf("\t11.在栈顶插入元素\n");
  101. int x;
  102. printf("\t请输入想要插入栈顶的元素:\n");
  103. scanf("%d",&x);
  104. Push(S,x);
  105. printf("\t插入完成\n");
  106. }
  107. break;
  108. default:
  109. printf("输入有误,请重新输入\n");
  110. }
  111. printf("\n\n\n");
  112. program();
  113. printf("\t输入的元素是:");
  114. scanf("%d",&num);
  115. printf("\n\n");
  116. }
  117. }

14.全部代码

  1. //define区
  2. #define Stack_Init_Size 100
  3. #define Stack_Increment 10
  4. #define OK 1
  5. #define OVERFLOW -2
  6. #define ERROR 0
  7. //预处理指令区
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. //typedef
  11. typedef int Status;
  12. typedef struct {
  13. int *base;
  14. int *top;
  15. int stacksize;
  16. }SqStack;
  17. Status InitStack(SqStack &S); //建栈
  18. SqStack InputStack(SqStack &S); //输入栈内元素
  19. Status Push(SqStack &S,int e); //进栈
  20. Status Pop(SqStack &S,int *e); //弹栈,并且返回出弹栈元素
  21. Status StackLength(SqStack S); //栈内元素的个数
  22. void PrintStack_int(SqStack S); //按栈输入的顺序输出栈里面的值
  23. void PrintStack_Pop(SqStack S); //按弹栈顺序输出栈里面的值
  24. void IsNullStack(SqStack S); //判断是否为空栈
  25. Status GetTop(SqStack S); //获取栈顶元素
  26. void ClearStack(SqStack &S); //清空栈
  27. void DestroyStack(SqStack &S); //摧毁栈
  28. void program(); //功能函数
  29. void swi(SqStack S); //switch
  30. int main()
  31. {
  32. SqStack S;
  33. S.base=NULL;
  34. swi(S);
  35. printf("\t程序退出了,下次见\n");
  36. }
  37. Status InitStack(SqStack &S)
  38. {
  39. //建栈
  40. S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
  41. if(!S.base) exit(OVERFLOW);
  42. S.top=S.base;
  43. S.stacksize=Stack_Init_Size;
  44. return OK;
  45. }
  46. SqStack InputStack(SqStack &S)
  47. {
  48. int a;
  49. /*scanf("%d",&a);
  50. while(a!=-1)
  51. {
  52. if(S->top-S->base>S->stacksize)
  53. {
  54. S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
  55. if(!S->base) printf("NoRealloc\n");
  56. S->top=S->base+S->stacksize;
  57. S->stacksize=S->stacksize+Stack_Increment;
  58. }
  59. *S->top++ = a;
  60. scanf("%d",&a);
  61. }*/
  62. InitStack(S);
  63. printf("\t");
  64. for(int i=0;;i++){
  65. scanf("%d",&a);
  66. if(a==-1)break;
  67. *S.top++ =a;
  68. }
  69. printf("\t写入完成\n");
  70. }
  71. Status Push(SqStack &S,int e)
  72. {
  73. //进栈
  74. if(S.top-S.base>S.stacksize)
  75. {
  76. S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
  77. if(!S.base) printf("NoRealloc\n");
  78. S.top=S.base+S.stacksize;
  79. S.stacksize=S.stacksize+Stack_Increment;
  80. }
  81. *S.top++=e;
  82. return OK;
  83. }
  84. Status Pop(SqStack &S,int *e)
  85. {
  86. //弹栈,并且返回出弹栈元素
  87. *e=*--S.top;
  88. return OK;
  89. }
  90. Status StackLength(SqStack S)
  91. {
  92. //栈长
  93. int Length=S.top-S.base;
  94. printf("\tlength = %d\n",Length);
  95. return Length;
  96. }
  97. void PrintStack_int(SqStack S)
  98. {
  99. //按栈输入的顺序输出栈里面的值
  100. int *p=S.base;
  101. while(p!=S.top)
  102. {
  103. printf("\t");
  104. printf(" %d ",*p);
  105. p++;
  106. }
  107. printf("\n");
  108. }
  109. void PrintStack_Pop(SqStack S)
  110. {
  111. //按栈弹出的顺序输出栈
  112. int *p=S.top-1;
  113. while(p!=S.base-1)
  114. {
  115. printf("\t");
  116. printf(" %d ",*p);
  117. p--;
  118. }
  119. printf("\n");
  120. }
  121. void IsNullStack(SqStack S)
  122. {
  123. //判断栈是否为空
  124. if(S.base==S.top||S.base==NULL)
  125. printf("\t栈为空栈\n");
  126. else
  127. printf("\t栈不为空\n");
  128. }
  129. Status GetTop(SqStack S)
  130. {
  131. //获取栈顶元素
  132. int e;
  133. e=*(S.top-1);
  134. printf("\t栈顶元素为%d\n",e);
  135. }
  136. void ClearStack(SqStack &S)
  137. {
  138. //清空一个栈
  139. S.top=S.base;
  140. }
  141. void DestroyStack(SqStack &S)
  142. {
  143. //摧毁一个栈
  144. free(S.base);
  145. S.base=S.top;
  146. S.stacksize=0;
  147. S.top=NULL;
  148. S.base=NULL;
  149. }
  150. void program()
  151. {
  152. printf("\t请输入以下功能数字\n");
  153. printf("\t0.退出\n");
  154. printf("\t1.判断栈是否为空\n");
  155. printf("\t2.按栈弹出的顺序输出栈\n");
  156. printf("\t3.按栈输入的顺序输出栈里面的值\n");
  157. printf("\t4.获取栈顶元素\n");
  158. printf("\t5.摧毁一个栈\n");
  159. printf("\t6.清空一个栈\n");
  160. printf("\t7.求栈的长度\n");
  161. printf("\t8.弹栈,并且返回出弹栈元素\n");
  162. printf("\t9.输入栈内数据\n");
  163. printf("\t10.在清空的基础下重新建立栈\n");
  164. printf("\t11.请输入想要插入栈顶的元素\n");
  165. }
  166. void swi(SqStack S){
  167. int num;
  168. program();
  169. printf("\t输入的元素是:");
  170. scanf("%d",&num);
  171. printf("\n\n");
  172. while(num)
  173. {
  174. switch(num)
  175. {
  176. case 0:
  177. num=0;
  178. break;
  179. case 1:
  180. if(S.base==NULL){
  181. printf("\t在进行操作1之前需要操作功能9\n");
  182. }else{
  183. printf("\t判断栈是否为空\n");
  184. IsNullStack(S);
  185. }
  186. break;
  187. case 2:
  188. if(S.base==NULL){
  189. printf("\t在进行操作2之前需要操作功能9\n");
  190. }else{
  191. printf("\t2.按栈弹出的顺序输出栈\n");
  192. PrintStack_Pop(S);
  193. }
  194. break;
  195. case 3:
  196. if(S.base==NULL){
  197. printf("\t在进行操作3之前需要操作功能9\n");
  198. }else{
  199. printf("\t3.按栈输入的顺序输出栈里面的值\n");
  200. PrintStack_int(S);
  201. }
  202. break;
  203. case 4:
  204. if(S.base==NULL){
  205. printf("\t在进行操作4之前需要操作功能9\n");
  206. }else{
  207. printf("\t4.获取栈顶元素\n");
  208. GetTop(S);
  209. }
  210. break;
  211. case 5:
  212. if(S.base==NULL){
  213. printf("\t在进行操作5之前需要操作功能9\n");
  214. }else{
  215. printf("\t5.摧毁一个栈\n");
  216. DestroyStack(S);
  217. printf("\t栈已经被摧毁\n");
  218. }
  219. break;
  220. case 6:
  221. if(S.base==NULL){
  222. printf("\t在进行操作6之前需要操作功能9\n");
  223. }else{
  224. printf("\t6.清空一个栈\n");
  225. ClearStack(S);
  226. printf("\t栈已经清空");
  227. }
  228. break;
  229. case 7:
  230. if(S.base==NULL){
  231. printf("\t在进行操作7之前需要操作功能9\n");
  232. }else{
  233. printf("\t7.求栈的长度\n");
  234. StackLength(S);
  235. }
  236. break;
  237. case 8:
  238. if(S.base==NULL){
  239. printf("\t在进行操作8之前需要操作功能9\n");
  240. }else{
  241. printf("\t弹栈,并且返回出弹栈元素\n");
  242. int a;
  243. Pop(S,&a);
  244. printf("\t8.弹栈弹出的元素是%d\n",a);
  245. }
  246. break;
  247. case 9:
  248. printf("\t9.输入栈内数据\n");
  249. InputStack(S);
  250. break;
  251. case 10:
  252. if(S.base==NULL){
  253. printf("\t在进行操作10之前需要操作功能9\n");
  254. }else{
  255. printf("\t10.在清空的基础下重新建立栈\n");
  256. DestroyStack(S);
  257. printf("\t请重新输入栈内数据\n");
  258. InputStack(S);
  259. }
  260. break;
  261. case 11:
  262. if(S.base==NULL){
  263. printf("\t在进行操作11之前需要操作功能9\n");
  264. }else{
  265. printf("\t11.在栈顶插入元素\n");
  266. int x;
  267. printf("\t请输入想要插入栈顶的元素:\n");
  268. scanf("%d",&x);
  269. Push(S,x);
  270. printf("\t插入完成\n");
  271. }
  272. break;
  273. default:
  274. printf("输入有误,请重新输入\n");
  275. }
  276. printf("\n\n\n");
  277. program();
  278. printf("\t输入的元素是:");
  279. scanf("%d",&num);
  280. printf("\n\n");
  281. }
  282. }

15.运行结果

在没有建立栈的条件下如果输入别的数据

 1.建栈

2.按栈弹出的顺序输出栈

 3.按栈输入的顺序输出栈里面的值

 4.获取栈顶元素

7.求栈的长度

 8.弹栈,并且返回出弹栈元素

验证:

 11.请输入想要插入栈顶的元素

6.清空

验证:

 

10.在清空的状态下重新输入栈

验证:

5.摧毁栈

 

0.退出

 

 

 

 

 

 

 

 

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