3.1栈的入门——概念与应用

初步认识栈

内容概述:先列举栈的来源框架结构,再开始介绍栈的一些基本知识点,继而说明顺序存储结构和链式存储结构,最后提到应用。

栈来源

  • 前文之前提到的线性表进行一定的操作受限就形成了栈和队列,其逻辑结构是属于线性结构,存储结构可通过顺序存储和链式存储实现。栈的出现是为了解决某些特定情形下的结构运算。具体可看下面的应用部分。

基本概念

栈是指只允许在一端进行插入或删除操作的线性表。因而它的操作受限是指只能在某一端进行插入和删除操作,因而栈的一个明显特性可以概括为后进先出(LIFO)。栈又可称为后进先出线性表。
下面是栈的一些专业名词解释:

名称解释
栈顶线性表允许进行插入和删除的那一端
栈底固定的,不允许进行插入和删除的另一端
空栈不含任何元素的空表

基本操作

函数名称作用
InitStack(&S)初始化一个空栈S
StackEmpty(S)判断一个栈是否为空,若栈为空则返回true,否则返回false
Push(&S,x)进栈,若栈S非空,将x加入使其称为新栈顶
Pop(&S,&x)出栈,若栈S非空,弹出栈顶元素,并用x返回
GetTop(S,&x)读栈顶元素,若栈S非空,用x返回栈顶元素
ClearStack(&S)销毁栈,并释放栈S占用的存储空间
  • 这里的&S是指C++中引用的含义,在C语言中使用*可达到同样目的。一般传入参数,如果无需修改传入参数的值,则无需传址。

顺序存储结构

使用顺序存储结构实现的栈称为顺序栈,是指 利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。

#define MaxSize 50     //定义栈中元素的最大个数
typedef struct{
    ElemType data[MaxSize];     //存放栈中元素
    int top;                   //栈顶指针
}SqStack;

这里是栈顺序存储实现代码

共享栈
共享栈是利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。

共享栈

链式存储结构

采用链式存储结构实现的栈称为链栈,优点在于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。

typedef struct LinkNode
{
    ElemType data;     //数据域
    strcu LinkNode * next;  //指针域
}*LinStack;     //栈类型定义
  • 一般使用单链表实现,并且规定所有操作都是在单链表的表头进行,这里规定链栈无头结点,Lhead指向栈顶元素。如下图所示:
    链栈

应用

  1. 栈在括号匹配中的应用
    算法思想:
    (1)初始化设置一个空栈,顺序读入括号
    (2)若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者是不合法的情况(括号序列不匹配,则退出程序)
    (3)若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性降了一级。算法结束时,栈为空,否则括号系列不匹配

  2. 栈在表达式求值中的应用

  3. 栈在递归中的应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值