#ifndef STATUS_H
#define STATUS_H
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int SElemType;
#endif
```cpp
#ifndef STACK_H
#define STACK_H
#include <stdio.h>
#include "status.h"
#define STACK_INIT_SIZE 100 //线性表存储空间的初始分配量
#define STACKINCREMENT 10 //线性表存储空间的分配增量
typedef struct {
SElemType *top; //指向栈顶
SElemType *base; //指向栈尾
int size;
}SqStack;
Status InitStack(SqStack *s);//初始化栈
Status Push(SqStack *s,SElemType e);//入栈
Status Pop(SqStack *s,SElemType *e);//出栈
Status GetTop(SqStack *s,SElemType *e);//栈顶
Status StackEmpty(SqStack *s);//判断是否为空
#endif
```cpp
#include <stdio.h>
#include "status.h"
#include "stack.h"
Status InitStack(SqStack *s){
s->base=(SqStack*)malloc(STACK_INIT_SIZE*sizeof(SqStack));
s->top=s->base;
s->size=STACK_INIT_SIZE;
}
Status Push(SqStack *s,SElemType e){
//现实生活
//首先判断栈是否已满,若满则重新扩展空间
if((s->top-s->base) >= s->size) {
s->base = (SElemType *)realloc(s->base,(s->size+STACKINCREMENT)*sizeof(SElemType));
if(!s->base) exit(OVERFLOW);
//田园生活 运行的情况
s->top = s->base+s->size ;
s->size += STACKINCREMENT ;
}
*s->top++ = e ;
return OK ;
}
Status Pop(SqStack *s,SElemType *e){
//出栈首先要判断栈是否为空,若为空则返回error
if(s->top==s->base)
return ERROR ;
e=*--s->top; //先减后取
return OK ;
}
Status GetTop(SqStack *s,SElemType *e){
//判断栈是否为空,若为空则返回error
if(s->base==s->top)
return ERROR ;
e = *(s->top-1);//取地址里的值
return OK ;
}
Status StackEmpty(SqStack *s){
if(s->base==s->top){
return OK;
}else
return ERROR;
}
```cpp
#include <stdio.h>
#include "stack.h"
int main(){
SqStack *sqlist;
SqStack *s=&sqlist;
int n,i,t;
SElemType *e;
/**********************************************
初始化栈
**********************************************/
InitStack(s);
printf("%d\n",s->size);
/**********************************************
入栈
**********************************************/
printf("请输入插入的个数");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("请输入%d个数为",i);
scanf("%d",&e);
Push(s,e);
}
/**********************************************
出栈
**********************************************/
Pop(s,&e);
printf("出栈的元素为 %d\n",e);
/**********************************************
输出栈顶元素
**********************************************/
GetTop(s,e);
printf("栈顶元素为%d\n",e);
/**********************************************
判断栈是否为空
**********************************************/
StackEmpty(s);
if(t==OK){
printf("栈为空\n");
}else{
printf("栈不为空\n");
}
}
!