当前位置:   article > 正文

数据结构-顺序栈的基本操作的实现(含全部代码)_顺序栈的完整代码

顺序栈的完整代码

主要操作函数如下:

  •     InitStack(SqStack &s) 参数:顺序栈s 功能:初始化  时间复杂度O(1)
  •     Push(SqStack &s,SElemType e) 参数:顺序栈s,元素e 功能:将e入栈 时间复杂度:O(1)
  •     Pop(SqStack &s,SElemType &e) 参数:顺序栈s,元素e 功能:出栈,e接收出栈元素值 时间复杂度O(1)
  •     GetTop(SqStack s,SElemType &e) 参数:顺序栈s,元素e 功能:得到栈顶元素 时间复杂度O(1)
  •     注意:严蔚敏版没有判断栈空函数,在入栈、出栈函数里面判断栈是否空,与王道的不同 尤其是top指针在base之上(有元素时)另外,严蔚敏版 59页取栈顶有误
    1. /*
    2. Project: sequence_stack (数据结构-顺序栈)
    3. Date: 2018/09/14
    4. Author: Frank Yu
    5. InitStack(SqStack &s) 参数:顺序栈s 功能:初始化 时间复杂度O(1)
    6. Push(SqStack &s,SElemType e) 参数:顺序栈s,元素e 功能:将e入栈 时间复杂度:O(1)
    7. Pop(SqStack &s,SElemType &e) 参数:顺序栈s,元素e 功能:出栈,e接收出栈元素值 时间复杂度O(1)
    8. GetTop(SqStack s,SElemType &e) 参数:顺序栈s,元素e 功能:得到栈顶元素 时间复杂度O(1)
    9. 注意:严蔚敏版没有判断栈空函数,在入栈、出栈函数里面判断栈是否空,与王道的不同 尤其是top指针在base之上(有元素时)
    10. 另外,严蔚敏版 59页取栈顶有误
    11. */
    12. #include<cstdio>
    13. #include<cstdlib>
    14. #include<cstring>
    15. #include<cmath>
    16. #include<iostream>
    17. using namespace std;
    18. #define Status int
    19. #define SElemType int
    20. #define MaxSize 100
    21. //栈数据结构
    22. typedef struct Stack
    23. {
    24. SElemType *base;//栈底指针 不变
    25. SElemType *top;//栈顶指针 一直在栈顶元素上一个位置
    26. int stacksize;//栈可用的最大容量
    27. }SqStack;
    28. //**************************************基本操作函数************************************//
    29. //初始化函数
    30. Status InitStack(SqStack &s)
    31. {
    32. s.base=new SElemType[MaxSize];//动态分配最大容量
    33. if(!s.base)
    34. {
    35. printf("分配失败\n");
    36. return 0;
    37. }
    38. s.top=s.base;//栈顶指针与栈底相同 王道上top起初在base下面,感觉很别扭,top应该高于或等于base
    39. s.stacksize=MaxSize;
    40. return 1;
    41. }
    42. //入栈
    43. Status Push(SqStack &s,SElemType e)
    44. {
    45. if(s.top-s.base==s.stacksize) return 0;//栈满
    46. *(s.top++)=e;//先入栈,栈顶指针再上移 注意与王道上的不同,具体问题具体分析
    47. return 1;
    48. }
    49. //出栈 用e返回值
    50. Status Pop(SqStack &s,SElemType &e)
    51. {
    52. if(s.top==s.base) return 0;//栈空
    53. e=*--s.top;//先减减 指向栈顶元素,再给e
    54. return 1;
    55. }
    56. //得到栈顶元素,不修改指针
    57. bool GetTop(SqStack s,SElemType &e) //严蔚敏版59页有问题,应该用e去获得,函数返回bool类型去判断
    58. {
    59. if(s.top==s.base) return false;//栈空
    60. else e=*--s.top;
    61. return true;
    62. }
    63. //********************************功能实现函数**************************************//
    64. //菜单
    65. void menu()
    66. {
    67. printf("********1.入栈 2.出栈*********\n");
    68. printf("********3.取栈顶 4.退出*********\n");
    69. }
    70. //入栈功能函数 调用Push函数
    71. void PushToStack(SqStack &s)
    72. {
    73. int n;SElemType e;int flag;
    74. printf("请输入入栈元素个数(>=1):\n");
    75. scanf("%d",&n);
    76. for(int i=0;i<n;i++)
    77. {
    78. printf("请输入第%d个元素的值:",i+1);
    79. scanf("%d",&e);
    80. flag=Push(s,e);
    81. if(flag)printf("%d已入栈\n",e);
    82. else {printf("栈已满!!!\n");break;}
    83. }
    84. }
    85. //出栈功能函数 调用Pop函数
    86. void PopFromStack(SqStack &s)
    87. {
    88. int n;SElemType e;int flag;
    89. printf("请输入出栈元素个数(>=1):\n");
    90. scanf("%d",&n);
    91. for(int i=0;i<n;i++)
    92. {
    93. flag=Pop(s,e);
    94. if(flag)printf("%d已出栈\n",e);
    95. else {printf("栈已空!!!\n");break;}
    96. }
    97. }
    98. //取栈顶功能函数 调用GetTop
    99. void GetTopOfStack(SqStack &s)
    100. {
    101. SElemType e;bool flag;
    102. flag=GetTop(s,e);
    103. if(flag)printf("栈顶元素为:%d\n",e);
    104. else printf("栈已空!!!\n");
    105. }
    106. //主函数
    107. int main()
    108. {
    109. SqStack s;int choice;
    110. InitStack(s);
    111. while(1)
    112. {
    113. menu();
    114. printf("请输入菜单序号:\n");
    115. scanf("%d",&choice);
    116. if(choice==4) break;
    117. switch(choice)
    118. {
    119. case 1:PushToStack(s);break;
    120. case 2:PopFromStack(s);break;
    121. case 3:GetTopOfStack(s);break;
    122. default:printf("输入错误!!!\n");
    123. }
    124. }
    125. return 0;
    126. }
    基本操作结果截图

    ----------------------------------------回复lena512.bmp(20200427)------------------------------------

回复lena512.bmp

 从图中可以看到地址及地址内存的数据。

------------------------------------------取栈顶的统一回复(20200920)-------------------------------------

传参有多种,可分为参数修改后对原变量进行修改和不修改。对于需要修改的,我们可以使用&或指针,对参数的修改会反应到原来的变量;对于不需要修改的,你可以继续使用&或指针,不做修改那很好,做了修改但是没有回溯(即忘记再反操作回原来的数值)那就不好了,为了防止自己忘记回溯,博主对于get、print等获取数据而不修改的函数使用传值方式,你可以去查看下方专栏的图相关内容,对于图的建立,传参是&G,而遍历则是G。

建议您先复制代码运行一下,没有问题再思考原理,出了问题再评论,好记性不如烂笔头,动手才是王道!

本人b站账号:lady_killer9

更多数据结构实现:数据结构严蔚敏版的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

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

闽ICP备14008679号