入栈操作
入栈操作又叫压栈操作,就是向栈中存放数据。入栈操作要在栈顶进行,每向栈中压入一个数据,top指针就增加1,直到栈满为止。
#define STACKINCREMENT 10
Push(sqStack *s, ElemType e){
if(s->top - s->base >= s->stacksize){
//栈满,追加空间
s->base = (ElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(ElemType));
if(!s->base) exit(0); //存储分配失败
s->top = s->base + s->stacksize;
s->stacksize = s->stacksize + STACKINCREMENT; //设置栈的最大容量
}
*(s->top) = e; //放入数据
s->top++;
}
出栈操作
出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作。每当从栈内弹出一个数据,栈的当前容量就减少1。可以重复出栈操作,直到该栈变为空栈为止。
Pop(sqStack *s, ElemType *e){
if(s->top == s->base) return;
*e = *--(s->top);
}
清空栈的操作
清空一个栈,就是希望把栈中的元素全部作废,而栈本身的物理空间并不一定发生改变。清空一个栈的代码如下:
ClearStack(sqStack *s){
s->top = s->base;
}
销毁一个栈
销毁一个栈就是要释放掉该栈所占据的物理内存空间。销毁一个栈的代码如下:
DestroyStack(sqStack *s){
int i, len;
len = s->stacksize;
for(i=0; i<len; i++)
{
free(s->base);
s->base++;
}
s->base = s->top = NULL;
}
计算栈的当前容量
计算栈的当前容量也就是计算栈中元素的个数,因此只要返回s.top - s.base即可。计算栈当前容量的代码如下:
int StackLen(sqStack s) {
return (s.top - s.base);
}
要注意栈的最大容量是指该栈占据内存空间的大小,其值为s.stacksize, 它与栈的当前容量不是一个概念