栈的介绍
栈的概念
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫叫做出栈。出数据也在栈顶。
栈的实现
由栈的定义可知:栈要遵循后进先出LIFO(Last In First Out)的原则。所以在设计实现栈时,用顺序表即数组来实现栈是十分合适的(数组对尾部操作方便)
栈的结构
采用动态数组来实现栈。其结构有一个指向数组的指针,记录栈顶位置的top,检查容量的capacity
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;//栈顶
int capacity;//容量
}ST;
栈的初始化
将所有成员都初始化置为0。要改变Stack这个结构体就要将其地址传过来,所以用assert断言一下,防止传错。
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;
pst->capacity = pst->top = 0;
}
插入数据——入栈
数据入栈就要检查空间是否足够,采用realloc以二倍的速度来动态扩容。
在确定空间足够的情况下,将数据插入数组即可
void STPush(ST* pst, STDataType x)
{
assert(pst);
if (pst->capacity == pst->top)//检查剩余容量
{
int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
ST* tmp = (ST*)realloc(pst->a, sizeof(STDataType ) * newcapacity);
if (tmp == NULL)
{
perror("realloc failed");
return;
}
pst->capacity = newcapacit