一、基础知识
栈:栈是一个
后进先出的线性表,它要求只在
表尾进行删除和插入操作。
所谓的栈就是一个特殊的线性表(顺序表、链表),但是它在操作上有一些特殊的要求和限制:
1.栈的元素只能“后进先出”。
2.栈的操作只能在这个线性表的表尾进行。
3.对于栈来说,表尾称为栈顶(top),相应的表头称为栈尾(bottom)。
二、栈的顺序存储结构
typedef int ElemType;
typedef struct
{
ElemType *base; //指向栈底的指针变量
ElemType *top; //指向栈顶的指针变量
int stackSize; //栈当前可用最大容量
}sqStack;
2.1 创建一个栈
#define STACK_INIT_SIZE 100
void 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;
}
2.2 入栈操作
#define STACKINCREMENT 10
void Push(sqStack *s, ElemType e)
{
if (s->top - s->base == s->stackSize)
{
s->base = (ElemType *)realloc(s->base, (STACK_INIT_SIZE + STACKINCREMENT)*sizeof(ElemType)); //realloc对malloc申请的内存空间进行动态调整
if (!s->base)
{
exit(0);
}
s->top = s->base + s->stackSize; //设置栈顶
s->stackSize = s->stackSize + STACKINCREMENT; //设置栈的最大容量
}
*(s->top) = e;
s->top++;
}
2.3 出栈操作
void Pop(sqStack *s, ElemType *e)
{
if (s->top == s->base) //栈空空如也
{
return;
}
*e = *--(s->top); //指向栈顶的位置是没有东西的
}
2.4 清空一个栈
所谓清空一个栈,就是将栈中的元素全部作废,但
栈本身物理空间并不发生改变(不是销毁)。
void ClearStack(sqStack *s)
{
s->top = s->base;
}
2.5 销毁一个栈
销毁一个栈和清空一个栈不同,销毁一个栈要释放掉该栈所占据的物理内存空间。
void 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;
}
2.6 计算一个栈的当前容量
计算栈的当前容量就是计算栈中元素的个数,栈的最大容量是指该栈占据内存空间的大小,其值是s.stackSize,它与栈的当前容量不是一个概念。
int StackLen(sqStack *s)
{
return s->top - s->base;
}