学习栈的时候自己写了个代码,革新就是加上了动态输出栈内容,可以直观的观察了解栈内情况,对初学栈的同学应该有一定帮助。
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef int SElemType;
//栈的定义
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//链表的创建
Status InitStack(SqStack &S){
S.base = (SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//栈顶的获取
Status GetTop(SqStack S, SElemType &e){
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
}
//入栈
Status Push(SqStack &S, SElemType e){
if(S.top - S.base >= S.stacksize){
S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top = S.base+S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ =e;
return OK;
}
//出栈
Status Pop(SqStack &S, SElemType &e){
if(S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
//输出栈,动态显示栈内情况
Status PrintStack(SqStack S){
SElemType *p;
p = S.top-1;
printf("-- --\n");
while(p >= S.base){
printf("|++%d++|\n", *p);
printf("|-----|\n");
p--;
}
return OK;
}
int main(){
printf("欢迎使用\n输入操作栈的序列个数以及序列内容\n");
SqStack S;
int n;
scanf("%d", &n);
InitStack(S);
for(int i = 0; i < n; i++){
SElemType x;
scanf("%d", &x);
Push(S, x);
}
int t;
printf("输入1:输出栈,动态显示栈内情况\n输入2:出栈,并输出出栈数\n输入3:入栈\n输入4:输出栈顶\n");
while(scanf("%d", &t)!=EOF){
if(t == 1)//输出栈
PrintStack(S);
else if(t == 2){
SElemType e;
Pop(S, e);//出栈,并输出出栈数
printf("%d\n", e);
}
else if(t == 3){
SElemType e;
printf("请输入入栈内容\n");
scanf("%d", &e);
Push(S, e);
}
else if(t == 4){
SElemType e;
GetTop(S, e);
printf("%d\n", e);
}
}
}