#include <stdio.h>
#include <stdlib.h>
/*栈(Stack)是只在表尾进行删除和插入的工作*/
/*栈,其实就是一个特殊的线性表,但是它在操作上有一些特殊的要求限制*/
/*栈的元素必须 "先进后出" */
/*栈的操作只在线性表的表尾进行*/
/*对于栈来说,表尾称为栈顶(top),表头成为栈底(bottom)*/
//栈的插入操作(push),叫做进栈,也称为压线,入栈,类似于子弹放入弹夹的动作
//栈的删除操作(pop),叫做出栈,也称为弹栈。如同弹夹中子弹出夹
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *base;//栈底
ElemType *top;//栈顶
int stackSize; //栈的当前可使用的最大容量
} sqStack;
void initStack(sqStack *s)
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s->base)
{
exit(0);
}
else
{
s->top = s->base;//最开始,栈顶就是栈底
s->stackSize = STACK_INIT_SIZE;
}
}
/*入栈操作(压栈操作)*/
void Push(sqStack *s, ElemType e)
{
//如果栈满,追加空间
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INIT_SIZE) * sizeof(ElemType));
if(!s->base)
{
exit(0);
}
else
{
s->top = s->base + s->stackSize;//设置栈顶
s->stackSize = s->stackSize + STACKINCREMENT; //
}
}
*(s->top) = e;
s->top++;
}
/*出栈操作*/
void Pop(sqStack *s, ElemType *e)
{
if(s -> top == s->base)
{
return ;
}
else
{
*e = *--(s->top);
}
}
/*清空一个栈*/
//只需把s->top的内容赋值给s->base 即可
void ClearStack(sqStack *s)
{
s->top = s->base;
}
/*销毁一个栈*/
//释放该栈所占据的物理内存空间
void DestoryStack(sqStack *s)
{
int i;
int len;
ElemType *p;
len = s->stackSize;
for(i = 0; i < len; i++)
{
s->base = p;
free(p);
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
}
/*计算栈的当前容量*/
int StackLen(sqStack s)
{
return (s.top - s.base);
}
int main()
{
sqStack S;
initStack(&S);
return 0;
}
栈的基本操作
于 2020-03-26 21:53:56 首次发布