栈:是限定仅在表尾进行插入和删除操作的线性表。(又称“后进先出”线性表)
栈顶:允许插入和删除的一端。
栈底:另一端。
空栈:不含任何数据元素的栈。

顺序存储结构:

  • 栈的定义
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;
  1. 创建空栈
int InitStack(LInkStack *S)
{
S=(LinkStack *)malloc(sizeof(LinkStack));
S->top=NULL;
S->count=0;
}
  1. 进栈
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;
}
  1. 出栈
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;
}

栈的应用:

  1. 递归
    在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。
    在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用状态。
  2. 括号匹配
  3. 后缀表达式求值**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值