今天说的是顺序栈。
而对于栈,我们最直观的了解就是它的先进后出原则,就和一群人走进的狭窄的死胡同是一样的,先进入的人被堵在里面,而后进入的人则可以先出去。
对于栈来说,当你的栈已满时,继续存入数据就会产生上溢
相对的,当栈为空栈时,继续出栈则会产生下溢
接下来,我们继续用一组代码,来看看顺序栈的一些操作
#include<stdio.h>
#include<stdlib.h>
#define STACK_SIZE 100 //初始的储存空间
#define STACK 10 //储存空间分配的增量
typedef struct stcak{
int *base; //基地址
int *top; //栈顶
int stacksize; //栈容量
} *Stack;
/*初始化顺序栈*/
Stack initStack(Stack s){
s = (Stack)malloc(sizeof(Stack));
if(!s){
exit(0);
}
s->base = (int*)malloc(STACK_SIZE * sizeof(int)); //分配足够多的地址
if(!s->base){
exit(0);
}
s->top = s->base;
s->stacksize = STACK_SIZE;
return s;
}
/*判断空栈*/
int IsEmpty(Stack s){
if(s->top == s->base){ //空栈
return 1;
}else{
return 0;
}
}
/*是否栈满*/
int Full(Stack s){
if(s->top - s->base == s->stacksize){ //栈满
return 1;
}else{
return 0;
}
}
/*顺序栈入栈*/
void Push(Stack s, int e){
if(Full(s)){ //栈满
s->base = (int *)malloc((STACK_SIZE + STACK) * sizeof(int)); //增加base的空间
if(!s->base){ //储存分配失败
exit(0);
}
s->top = s->base + s->stacksize;
s->stacksize += STACK;
}
*s->top++ = e;
}
/*顺序栈出栈*/
int pop(Stack s){
if(s->top == s->base){
return 0;
}else{
return *(--s->top); //s->top移动
}
}
/*访问栈顶*/
int GetTop(Stack s){
if(s->top == s->base){
return 0;
}else{
return *(s->top-1);//s->top未移动
}
}
/*顺序栈销毁*/
void DestroyStack(Stack s){
free(s->base);
free(s);
}
int main(){
Stack s = NULL;
s = initStack(s);
int i;
for(i = 0; i < 5; i++){
Push(s,i);
}
for(i = 0; i < 5; i++){
printf("此时的栈顶为:%d\n",GetTop(s));
printf("此时出栈的是:%d\n",pop(s));
}
DestroyStack(s);
return 0;
}