顺序栈,就是用一组地址连续的存储单元来存放栈元素,然后用一个栈结构去维护一个栈。在C中,可用动态开辟的数组去表示,维护的栈结构需要有一个栈底和一个栈顶指针。因为开辟一个数组需要事先知道它的大小,所以栈结构里就必须还有一个整型变量来表示当前栈的存储容量,再可定义一个变量用来扩充栈的最大容量。实现如下:
#include
#include
#include
//顺序栈实现
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef struct{
int *base;//在栈构造之前和销毁之后,base的值为NULL
int *top;//栈顶指针
int stacksize;//当前已分配的存储空间,已元素为单位
}SqStack;
//顺序栈基本操作实现
//构造一个空栈
//初始化成功返回true
bool InitStack(SqStack &S){
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base){
exit(-1);//存储分配失败
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return true;
}
//销毁栈S,S不在存在
//销毁成功,返回true
int DestroyStack(SqStack &S){
if (S.base == NULL) exit(1); //栈结构不存在,程序异常退出
free(S.base);
S.base = NULL;
return true;
}
//把S置为空栈
//成功返回true
int ClearStack(SqStack &S){
if(S.base == NULL) exit(1);
S.base = S.top;
return true;
}
//判断是否空栈
//返回,true-空栈,false-非空栈
int StackEmpty(SqStack &S){
if(S.base == NULL) exit(1);
int ret = S.top - S.base ? false : true;
return ret;
}
//返回当前栈的长度
//成功返回当前栈的长度,异常退出
int StackLength(SqStack &S){
if(S.base == NULL) exit(1);
return S.top - S.base;
}
//取出栈顶元素
int GetTop(SqStack &S, int &e){
if(S.top - S.base == 0){
return false;
}
e = *(S.top - 1);
}
//入栈
int Push(SqStack &S, int e){
//插入元素e为新的栈顶元素
if(S.top - S.base >= S.stacksize){//栈满,追加存储空间
S.base = (int *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(int));
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
* S.top++ = e;
return true;
}
//出栈
int Pop(SqStack &S,int &e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回true,否则返回false
if(S.top - S.base == 0) return false;
e = * --S.top;
return true;
}