栈:是限定仅在表尾进行插入和删除操作的线性表。(又称“后进先出”线性表)
栈顶:允许插入和删除的一端。
栈底:另一端。
空栈:不含任何数据元素的栈。
顺序存储结构:
- 栈的定义
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int top; /*用于栈顶指针*/
}sqstack;
- 创建空栈
/*创建栈*/
sqstack *sqstack_create( )
{
sqstack *S;
S=(sqstack *)malloc(sizeof(*S));
S->top=-1;
return S;
}
- 进栈
int push(sqstack *S,SElemType e)
{
if(S->top==MAXSIZE-1) /*栈满*/
{
return -1;
}
S->top++; /*栈顶指针+1*/
S->data[S->top]=e; /*将新插入元素赋给栈顶空间*/
return 0;
}
- 出栈
int pop(sqstack *S,SElemType *e)
{
if(S->top==-1)
{
return -1;
}
*e=S->data[S->top]; /*用e返回其将要删除的栈顶元素*/
S->top--;
return 0; /*栈顶指针-1*/
}
链式存储结构:
- 链栈的定义
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackptr top;
int count;
}LinkStack;
- 创建空栈
int InitStack(LInkStack *S)
{
S=(LinkStack *)malloc(sizeof(LinkStack));
S->top=NULL;
S->count=0;
}
- 进栈
int push(LinkStack * ,S,SElemType e)
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data=e;
s->next=S->top;
S->top=s;
S->count++;
return 0;
}
- 出栈
int pop(LinkStack *S,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*S))
return -1;
*e=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
S->count--;
return 0;
}
栈的应用:
- 递归
在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。
在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用状态。 - 括号匹配
- 后缀表达式求值**