//库函数头文件包含
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//状态码的定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACKINITSIZE 3
#define ADDSTACKSIZE 10
typedef int SElemType;
typedef int Status;
//栈结构的定义
typedef struct Stack{
SElemType *base;
SElemType *top;
int LengthOfStack;
}Stack;
//构造一个空栈
Status InitStack(Stack &S){
S.base = (SElemType *)malloc(STACKINITSIZE * sizeof(SElemType)); //开辟一段空间
if(!S.base)
exit(OVERFLOW); //储存分配失败
S.top = S.base; //使栈顶指针指向栈底
S.LengthOfStack = STACKINITSIZE; //记录开辟的空间的大小
return OK;
}
//栈的销毁
Status DestroyStack(Stack &S){
S.top = S.base; //将栈顶指针指向栈底
free(S.base); //释放开辟的空间
S.LengthOfStack = 0; //将最大容量改为0
return OK;
}
//清空栈
Status ClearStack(Stack &S){
S.top = S.base; //直接将栈顶指针指向栈底,就相当于栈被清空
return OK;
}
//判断栈长度
Status StackLength(Stack S){
return S.top - S.base;
}
//判断栈空
bool Is_StackEmpty(Stack S){
if(S.base == S.top)
return true;
return false;
}
//获得栈顶元素的值
SElemType GetTop(Stack &S){
if(S.base == S.top)
return ERROR;
return *(S.top - 1);
}
//入栈
Status Push(Stack &S, SElemType elem){
if(StackLength(S) >= S.LengthOfStack){
S.LengthOfStack += ADDSTACKSIZE;
S.base = (SElemType *)realloc(S.base, (S.LengthOfStack) * sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
}
*S.top = elem;
S.top++;
return OK;
}
//出栈
Status Pop(Stack &S, SElemType &elem){
if(S.base == S.top)
return ERROR;
elem = *(S.top - 1);
S.top--;
return OK;
}
//遍历函数
Status visit(SElemType elem){
printf("%d ", elem);
return OK;
}
//遍历栈
Status StackTraverse(Stack S, Status (*visit)(SElemType)){
SElemType e;
while(!Is_StackEmpty(S)){
if(visit(GetTop(S)) == ERROR)
return ERROR;
Pop(S, e);
}
return OK;
}
//主函数
int main(){
Stack S;
InitStack(S);
int a;
printf("输入5个数字:\n");
for(int i = 0; i < 5; i++){
scanf("%d", &a);
Push(S, a);
}
printf("下面是执行遍历操作的输出结果:\n");
StackTraverse(S, visit);
printf("\n下面是返回栈长的结果:\n");
printf("%d\n", StackLength(S));
printf("下面是执行出栈后遍历的结果:\n");
Pop(S, a);
StackTraverse(S, visit);
printf("\n下面是获得栈顶元素的操作:\n%d\n", GetTop(S));
printf("下面是判断栈是否为空的操作(空输出YES,不空输出NO和栈长):\n");
if(Is_StackEmpty(S))
printf("YES");
else
printf("NO %d", StackLength(S));
return 0;
}
顺序栈的表示和实现
最新推荐文章于 2024-08-01 09:21:53 发布