/*
* 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;
}