/* * C语言版简单的固态顺序栈概念示例(数组风格)* Date: 2021年1月30日* Author:phil616@126.com*/#include <cstdio>#include <malloc.h>#define MAX 100 //定义栈的最大储存元素typedef int DataType; //定义栈数据的别名struct OrderStack //创建结构体{ DataType stack[MAX]; //定义栈数组 int top; //栈顶 int bottom; //栈底}stack; //将栈实例化void initStack() { //初始化栈 int i; for (i = 0; i < MAX; i++) { //将栈所有元素置为0 stack.stack[i] = 0; //这里的0是指固态栈模拟动态栈的置空 } stack.top = -1; //栈顶初始化为-1 stack.bottom = 0; //栈底初始化为0}int push(DataType data) { //压栈(入栈)函数 stack.stack[++stack.top] = data; return stack.top; //将数据压入并返回栈顶}int pull() { //弹栈(出栈)函数 int i; if (stack.top == -1) { //判断是否为空栈 printf("Stack is empty,Unable to pull elements\n"); return stack.top; //直接返回栈顶 } printf("Pull stack elements %d\n", stack.stack[stack.top]); stack.top--; //每次弹出一个元素,栈顶下沉一次 return stack.top; //返回当前栈顶}void traverseStack(int model) { //遍历栈,参数表是int型,如果是1(真值)则为正序遍历,如果是假值则为逆序遍历 int i; if (stack.top == -1) { //判断是否栈空,如果栈空则不遍历,直接返回 printf("Stack is empty, Unable to traverse\n"); return; } if (model == 1) { for (i =stack.bottom ; i <= stack.top; i++) { printf("No.%d = %d\n", i,stack.stack[i]); } //遍历只访问不修改,不对栈顶栈底进行操作 } else { //假值传入的分支 for (i = stack.top; i >= stack.bottom; i--) { printf("No.%d = %d\n", i, stack.stack[i]); } }}void destructStack() { //清空栈,销毁只是对栈顶进行更改,初始化只是模拟动态栈的情况 int i; for (i = stack.top; i >= stack.bottom; i--) {// printf("%d\t %d\n", stack.stack[i], stack.top);//此语句是调试语句 stack.stack[stack.top] = 0; stack.top--; //栈唯一依据是栈顶,即使不修改栈内元素,只修改栈顶计数也可以 }}int OrderStack() { int i; initStack(); //先初始化栈 for (i = 0; i < 10; i++) { //压入10个元素 push(i); } for (i = 0; i < 5; i++) { //弹出5个元素 pull(); } traverseStack(0); //遍历一遍,应该是5个 for (i = 0; i < 5; i++) { //再次弹出5个,此时十个都被弹出 pull(); } pull(); //此时应该是栈空,无法弹栈 for (i = 0; i < 10; i++) { //在压入十个元素 push(i); } traverseStack(0); //正序遍历一遍 destructStack(); //销毁栈 return 0;}