C++学习之栈和队列

1.栈的基本概念

栈的基本概念

  • 概念:

首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。

  • 特性

它的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。

  • 操作
    1. 栈的插入操作,叫做进栈,也成压栈。类似子弹入弹夹(如下图所示)
    2. 栈的删除操作,叫做出栈,也有的叫做弾栈,退栈。如同弹夹中的子弹出夹(如下图所示)

2.栈的顺序存储解析

  • 基本概念

栈的顺序存储结构简称顺序栈,它是运算受限制的顺序表。顺序栈的存储结构是:利用一组地址连续的的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序表中的位置。

  • 设计与实现

因为栈是一种特殊的线性表,所以栈的顺序存储可以通过顺序线性表来实现。

3.栈的顺序存储实现

  • 基本概念

栈的链式存储结构简称链栈。

思考如下问题

 栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?

由于单链表有头指针,而栈顶指针也是必须的,那干嘛不让他俩合二为一呢,所以比较好的办法就是把栈顶放在单链表的头部。另外都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。

  • 设计与实现

链栈是一种特殊的线性表,链栈可以通过链式线性表来实现。

4.栈的分文件编写

1.4.1就近匹配

几乎所有的编译器都具有检测括号是否匹配的能力,那么如何实现编译器中的符号成对检测?如下字符串:

5+5*(6)+9/3*1)-(1+3(

  • 算法思路
    1. 从第一个字符开始扫描
    2. 当遇见普通字符时忽略,
    3. 当遇见左符号时压入栈中
    4. 当遇见右符号时从栈中弹出栈顶符号,并进行匹配
    5. 匹配成功:继续读入下一个字符
    6. 匹配失败:立即停止,并报错
    7. 结束:
    8. 成功: 所有字符扫描完毕,且栈为空
    9. 失败:匹配失败或所有字符扫描完毕但栈非空
  • 总结
    1. 当需要检测成对出现但又互不相邻的事物时可以使用栈“后进先出”的特性
    2. 栈非常适合于需要“就近匹配”的场合

示例代码\11 栈的案例_就近匹配

1.4.2中缀表达式和后缀表达式
  1. 后缀表达式(由波兰科学家在20世纪50年代提出)
    1. 将运算符放在数字后面 ===》 符合计算机运算
    2. 我们习惯的数学表达式叫做中缀表达式===》符合人类思考习惯
  2. 实例
    1. 5 + 4 => 5 4 +  
    2. 1 + 2 * 3 => 1 2 3 * +  
    3. 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * +
  3. 中缀转后缀算法:

遍历中缀表达式中的数字和符号:

  1. 对于数字:直接输出
  2. 对于符号:
    1. 左括号:进栈  
    2. 运算符号:与栈顶符号进行优先级比较
  • 若栈顶符号优先级低:此符号进栈  

(默认栈顶若是左括号,左括号优先级最低)

  • 若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈
  1. 右括号:将栈顶符号弹出并输出,直到匹配左括号

遍历结束:将栈中的所有符号弹出并输出

  1. 动手练习

将我们喜欢的读的中缀表达式转换成计算机喜欢的后缀表达式

中缀表达式: 8 + ( 3 – 1 ) * 5

 后缀表达式:  8 3 1 – 5 * +

5.栈的链式存储

6.栈的应用案例--就近匹配思路

7.栈的应用案例--就近匹配代码实现

8.中缀表达式转后缀表达式

  1. 后缀表达式(由波兰科学家在20世纪50年代提出)
    1. 将运算符放在数字后面 ===》 符合计算机运算
    2. 我们习惯的数学表达式叫做中缀表达式===》符合人类思考习惯
  2. 实例
    1. 5 + 4 => 5 4 +  
    2. 1 + 2 * 3 => 1 2 3 * +  
    3. 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * +
  3. 中缀转后缀算法:

遍历中缀表达式中的数字和符号:

  1. 对于数字:直接输出
  2. 对于符号:
    1. 左括号:进栈  
    2. 运算符号:与栈顶符号进行优先级比较
  • 若栈顶符号优先级低:此符号进栈  

(默认栈顶若是左括号,左括号优先级最低)

  • 若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈
  1. 右括号:将栈顶符号弹出并输出,直到匹配左括号

遍历结束:将栈中的所有符号弹出并输出

  1. 动手练习

将我们喜欢的读的中缀表达式转换成计算机喜欢的后缀表达式

中缀表达式: 8 + ( 3 – 1 ) * 5

 后缀表达式:  8 3 1 – 5 * +

9.基于后缀表达式的运算

  1. 思考

计算机是如何基于后缀表达式计算的?

例如:8 3 1 – 5 * +

  1. 计算规则

遍历后缀表达式中的数字和符号

    1. 对于数字:进栈
    2. 对于符号:
      1. 从栈中弹出右操作数
      2. 从栈中弹出左操作数
      3. 根据符号进行运算
      4. 将运算结果压入栈中

遍历结束:栈中的唯一数字为计算结果

10.课程回顾

11.队列的基本概念

12.队列的顺序存储实现

13.队列链式存储思路分析

14.队列的链式存储实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值