目录
一、栈简介
栈跟顺序表和链表一样也是一种线性表。栈的特性就是“先进后出“,或者说”后进先出“。就如一个羽毛球桶一样最先放进去的羽毛球在最底下,只能把它上边的拿出来才能拿最先放进去的羽毛球。
二、代码实现
1.节点结构
栈可以用顺序表的结构,以顺序表的头作为栈底,尾作为栈顶。也可以使用单链表,用表头作栈顶,表尾作栈顶。这里使用的是第一种结构。
跟顺序表的结构差不多,比较特别的是定义一个栈顶,后面的操作只能在栈顶top上。
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
2.初始化和销毁
基本上与顺序表相同。top栈顶的设置可以为-1,或0。分别表示指向栈顶元素和栈顶元素的后一个。这两种方式都可以,这里采用top=0的方式。
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->top = 0;
ps->capacity = 0;
}
3.插入和删除
插入时注意检查内存空间是否充足,这也是设置capacity的原因。
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->top == ps->capacity)
{
int newCapcity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* temp = (STDataType*)realloc
(ps->a,sizeof(STDataType)* newCapcity);
if (temp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->a = temp;
ps->capacity = newCapcity;
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
4.其他接口
写一些返回栈的简单信息的函数,返回栈顶元素、栈的个数、判断是否为空等。
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top - 1];
}
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
总结
栈的内容比较简单,用顺序表实现就很容易。在某些特定的场合可使用栈这种数据结构。