版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csuft20164442/article/details/86546851
定义
栈(Stack)是一个后进先出的线性表,它要求只在表尾进行删除和插入操作。
注:表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)。
栈的插入和删除操作
插入操作(Push):叫做进栈,也称为压栈、入栈。
删除操作(Pop):叫做出栈,也称为弹栈。
栈的存储结构
栈本身是一个线性表,线性表分为顺序存储结构和栈的链式存储结构两种存储形式。
顺序存储结构
定义:
typedef int ElemType;
typedef struct
{
ElemType *base; //指向栈底的指针变量
ElemType *top; //指向栈顶的指针变量
int stackSize; //指示栈的当前可使用的最大容量
}sqStack;
创建一个栈
#define STACK_INIT_SIZE 100 //初始化栈的空间为100
initStack(sqStack *S)
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //分配内存空间
if( !s -> base)
exit(0);
s->top = s->base; //最开始,栈顶就是栈底
s->stackSize = STACK_INIT_SIZE; //可用空间为定义空间
}
入栈(插入)操作
- 入栈操作又叫压栈操作,就是向栈中存放数据。
- 人员在入栈操作要在栈顶进行,每次向栈中压入一个数据,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->stackSize = 0
}
计算栈的当前容量
计算栈的当前容量就是计算栈中元素的个数,因此只要返回s.top-s.base即可。
注意:
栈的最大容量是指该站占据内存空间的大小,其值是s.stackSize,它与栈的当前容量不是一个概念。
int stackLen(sqStack s)
{
return(s.top - s.base);//返回当前栈容量值
}