一,栈的定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
- 栈顶(top):允许进行插入和删除操作的一端,栈顶浮动
- 栈底(bottom): 不允许进行插入和删除操作的一端,栈底固定
- 空栈:栈中元素个数为零
栈按照后进先出的原则存储数据,是一种只能在一端进行插入和删除操作的特殊线性表。
2,栈的基本操作
- StackInit(ps):初始化为空栈
- StackDestroy(ps):销毁栈
- StackPush(ps, x):入栈(栈的插入),若栈未满,插入x元素
- StackPop(ps):出栈(栈的删除)
- StackTop(ps):返回栈顶元素
- StackEmpty(ps):判段栈是否为空
二,顺序栈
顺序栈是指利用顺序存储结构实现的栈。采用地址连续的存储空间依次存储栈中数据元素,由于入栈和出栈运算都是在栈顶进行,而栈底位置是固定不变的,可以将栈底位置设置在数组空间的起始处;栈顶位置是随入栈和出栈操作而变化的,故需用一个整型变量top来记录当前栈顶元素在数组中的位置。
除了top,还需要一个记录栈容量大小的整形变量capacity,及指向数组的指针。
因此栈的顺序存储结构可描述为:
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
栈初始化:
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->top = ps->capacity = 0;
}
top的初始化可以设为 0 或 -1,top为0时表示top为栈顶元素的下一个,top = -1就是top等于栈顶元素的位置。
判空:
布尔类型,返回值为真或假
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0; //返回判定结果,返回真,表示栈为空,反之不为空
}
入栈:
void StackPush(ST* ps, STDataType x)
{
assert(ps);
//判断空栈或满栈
if (ps->top == ps->capacity)
{
//容量为0时,Capacity等于4,不为0,capacity * 2
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = (STDataType*)realloc(ps->a, newCapacity*sizeof(STDataType));
if (tmp == NULL)
{
perror("realloc fail");
exit(-1);
}
ps->a = tmp;
ps->capacity = newCapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
出栈:
void StackPop(ST* ps)
{
//assert判空,条件错误时,终止运行,
//StackEmpty(ps)为真,栈为空,! 取反,条件错误。程序终止,即表示栈空
assert(ps);
assert(!StackEmpty(ps));
--ps->top;
}
读取栈顶元素:
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top - 1];
}