建立一个工作空间
1.新建status.h
#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 char SElemType;
typedef int ElemType;
#endif
2.创建ZhanXunXu.h
#ifndef ZHANSHUNXU_H
#define ZHANSHUNXU_H
#include "status.h"
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//1.构建一个空栈
Status InitStack(SqStack *S);
//2.销毁栈
Status DestroyStack(SqStack *S);
//3.清空栈
Status ClearStack(SqStack *S);
//4.判断栈是否为空
Status StackEmpty(SqStack S);
//5.求栈的长度
Status StackLength(SqStack S);
//6.//求栈顶元素
Status GetTop(SqStack S, SElemType *e);
//7.栈顶插入元素
Status Push(SqStack *S, SElemType e);
//8.删除栈顶元素
Status Pop(SqStack *S, SElemType *e);
//9.遍历栈
Status StackTraverse(SqStack S,int(*vist)(SElemType));
#endif
3.ZhanShunXu.c
#include "zhanShunxu.h"
#include <stdio.h>
//1.构建一个空栈
Status InitStack(SqStack *S)
{
(*S).base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
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; //进栈先赋值,栈顶指针再自增
(S->top)++;
return OK;
}
Status Pop(SqStack *S, SElemType *e)
{
if((*S).top==(*S).base) return ERROR;
(*S).top--; //出栈栈顶指针先递减,再赋值
*e = *((*S).top);
return OK;
}
Status StackEmpty(SqStack S){
//若栈为空,返回true;否则返回FALSE
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
Status StackLength(SqStack S){//顺序栈S
return S.top-S.base;
}
Status ClearStack(SqStack *S){
if((*S).base)(*S).top=(*S).base;//栈底栈顶相同为空栈
return OK;
}
Status DestroyStack(SqStack *S){
if((*S).base){
free((*S).base);
(*S).stacksize=0;
(*S).base=(*S).top=NULL;
}
return OK;
}
Status StackTraverse(SqStack S,int (*visit)(SElemType)){
while(S.top>S.base)
visit(*S.base++);
printf("\n");
return OK;
}
4ZhanShunXu_main.c
#include "zhanShunxu.h"
#include <stdio.h>
void main(){
int visit(SElemType c){
printf("%d",c);
return OK;
}
int j;
SElemType e;
SqStack S;
//创建一个顺序栈
if(InitStack(&S)==1)
printf("顺序栈创建成功!\n");
//查看栈的长度
printf("站的长度为%d\n",StackLength(S));
//查看是否为空栈
printf("栈是否为空:%d (1:空 0:否)\n",StackEmpty(S));
//初始化
for(j=1;j<=12;j++) {
Push(&S,j);
}
printf("栈中元素依次为:");
StackTraverse(S,visit);
Pop(&S,&e);
printf("弹出的栈顶元素为:e=%d\n",e);
printf("站是否为空:%d",StackEmpty(S));
GetTop(S,&e);
printf("栈顶元素e=%d 栈的长度为%d\n",e,StackLength(S));
ClearStack(&S);
printf("清空后栈空否:%d(1:kong 0 否)\n",StackEmpty(S));
DestroyStack(&S);
printf("销毁战后 S.top=%u S.base=%u S.stacksize=%d\n",S.top,S.base,S.stacksize);
}