栈的概念:
栈是一种特殊的线性表,只允许固定一端进行插入或者删除操作,进行数据操插入和删除的一端称为栈顶,另一端称为栈底。栈中的数据遵循后进先出的原则。
压栈:栈的插入操作,也叫做进栈/入栈
出栈:栈的删除操作,出数据也在栈顶
栈的实现
一般栈可以由数组和链表实现,但是相对而言数组结构实现栈会更优一点,因为数组在尾部插入删除数据效率更高。
静态栈
不支持动态增长,大小固定
typedef int STDataType;
#define N 10
typedef stuuct Stack
{
STDataType* a[N];
int top;
}Stack;
动态栈
支持动态增长,应用较广泛
typedef int STDataType;
typedef stuuct Stack
{
STDataType* a;
int top;//栈顶
int capacity;//容量
}Stack;
初始化栈
void StackInit(Stack* s, int n)
{
assert(s);
ps->a = (STDataType*)malloc(sizeof(STDataType)*n);
ps->top = 0;
ps->capacity = n;
}
栈顶
STDataType StackTop(Stack* s)
{
assert(s);
return s->a[s->top - 1];
}
入栈
void StackPush(Stack* s, STDataType x)
{
assert(s);
if (s->top == s->capacity)
{
s->a = (STDataType*)realloc(s->_a, ps->capacity * 2 * sizeof(STDataType));
s->capacity *= 2;
}
s->a[s->top] = x;
s->top++;
}
出栈
void StackPop(Stack* s)
{
assert(s);
if (s->top > 0)
{
s->_top--;
}
}
栈的大小和栈空
int StackSize(Stack* s)
{
assert(s);
return s->_top;
}
int StackEmpty(Stack* s)
{
assert(s);
return s->top == 0 ? 0 : 1;
}