栈:后进先出的线性表,要求在表尾进行数据的删除和插入操作、
1)栈的元素必须先进后出
2)栈的操作只能限定在这个顺序表的表尾进行。
对于栈,这个顺序表或者链表的表尾(进行删除和插入的地方)称为栈顶top,相应的表头称为栈底bottom、
定义一个顺序栈:
typedef struct{
ElemType *base;//指向栈底的指针变量
ElemType *top; //指向栈顶的指针变量
int stacksize;//栈的当前可使用的最大容量
}sqStack;
创建一个空栈
#define STACK_INIT_SIZE 100
initStack(sqStack *s){
//内存中开辟一段连续空间作为栈空间,首地址赋值给s->base
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s->base) exit(0); //分配空间失败
s->top = s->base; //最开始,栈顶就是栈底,此时为空栈
s->stacksize = STACK_INIT_SIZE;
}
入栈
#define STACKINCREMENT 10
Push(sqStack *s,ElemType e){
if(s->top - s->base >= s->stacksize) { //判断栈是否满
//如果栈满,通过realloc()函数追加空间
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++;
}
注意:top指向的空间始终为栈顶元素的上一个空间。
出栈:
Push(sqStack *s,ElemType e){
if(s->top = s->base ) return;
*e = *--(s->top);//先将指针减一,再取出指针指向的内容,赋值给e
}
清空栈:希望将栈中元素全部作废,而栈本身的物理空间并不一定发生改变。
ClearStack(sqStack *s) {
s->top = s->base;
}
销毁一个栈:释放掉该栈所占据的物理内存空间。
DestroyStack(sqStack *s){
free(s->base);
s->base = s->top =NULL;
s->stacksize = 0;
}
计算栈的当前容量
int StackLen(sqStack *s){
return (s->base - s->top);
}
拥抱明天!
不给自己做枷锁去限制自己。
别让时代的悲哀,成为你人生的悲哀。

浙公网安备 33010602011771号