1. /*
    2. * C语言版简单的固态顺序栈概念示例(数组风格)
    3. * Date: 2021年1月30日
    4. * Author:phil616@126.com
    5. */
    6. #include <cstdio>
    7. #include <malloc.h>
    8. #define MAX 100 //定义栈的最大储存元素
    9. typedef int DataType; //定义栈数据的别名
    10. struct OrderStack //创建结构体
    11. {
    12. DataType stack[MAX]; //定义栈数组
    13. int top; //栈顶
    14. int bottom; //栈底
    15. }stack; //将栈实例化
    16. void initStack() { //初始化栈
    17. int i;
    18. for (i = 0; i < MAX; i++) { //将栈所有元素置为0
    19. stack.stack[i] = 0; //这里的0是指固态栈模拟动态栈的置空
    20. }
    21. stack.top = -1; //栈顶初始化为-1
    22. stack.bottom = 0; //栈底初始化为0
    23. }
    24. int push(DataType data) { //压栈(入栈)函数
    25. stack.stack[++stack.top] = data;
    26. return stack.top; //将数据压入并返回栈顶
    27. }
    28. int pull() { //弹栈(出栈)函数
    29. int i;
    30. if (stack.top == -1) { //判断是否为空栈
    31. printf("Stack is empty,Unable to pull elements\n");
    32. return stack.top; //直接返回栈顶
    33. }
    34. printf("Pull stack elements %d\n", stack.stack[stack.top]);
    35. stack.top--; //每次弹出一个元素,栈顶下沉一次
    36. return stack.top; //返回当前栈顶
    37. }
    38. void traverseStack(int model) { //遍历栈,参数表是int型,如果是1(真值)则为正序遍历,如果是假值则为逆序遍历
    39. int i;
    40. if (stack.top == -1) { //判断是否栈空,如果栈空则不遍历,直接返回
    41. printf("Stack is empty, Unable to traverse\n");
    42. return;
    43. }
    44. if (model == 1) {
    45. for (i =stack.bottom ; i <= stack.top; i++) {
    46. printf("No.%d = %d\n", i,stack.stack[i]);
    47. } //遍历只访问不修改,不对栈顶栈底进行操作
    48. }
    49. else { //假值传入的分支
    50. for (i = stack.top; i >= stack.bottom; i--) {
    51. printf("No.%d = %d\n", i, stack.stack[i]);
    52. }
    53. }
    54. }
    55. void destructStack() { //清空栈,销毁只是对栈顶进行更改,初始化只是模拟动态栈的情况
    56. int i;
    57. for (i = stack.top; i >= stack.bottom; i--) {
    58. // printf("%d\t %d\n", stack.stack[i], stack.top);//此语句是调试语句
    59. stack.stack[stack.top] = 0;
    60. stack.top--; //栈唯一依据是栈顶,即使不修改栈内元素,只修改栈顶计数也可以
    61. }
    62. }
    63. int OrderStack() {
    64. int i;
    65. initStack(); //先初始化栈
    66. for (i = 0; i < 10; i++) { //压入10个元素
    67. push(i);
    68. }
    69. for (i = 0; i < 5; i++) { //弹出5个元素
    70. pull();
    71. }
    72. traverseStack(0); //遍历一遍,应该是5个
    73. for (i = 0; i < 5; i++) { //再次弹出5个,此时十个都被弹出
    74. pull();
    75. }
    76. pull(); //此时应该是栈空,无法弹栈
    77. for (i = 0; i < 10; i++) { //在压入十个元素
    78. push(i);
    79. }
    80. traverseStack(0); //正序遍历一遍
    81. destructStack(); //销毁栈
    82. return 0;
    83. }