栈和队列以及其相关的案例

一、栈和队列的定义和特点

    • 引入栈和队列

栈和队列是两种常用的、重要的数据结构;

栈和队列是限定插入和删除只能在表的“端点”进行的线性表

栈和队列是线性表的子集(是插入和删除位置受限的线性表)。

线性表                         栈                      队列
Insert(L,i,x)           Insert(S,n+1,x)           Insert(S,n+1,x) 
1<=i<=n+1           
Delete(L,i)             Delete(S,n)               Delete(Q,1)
1<=i<=n
    • 队列的常见应用

由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具。

  • 脱机打印输出:按申请的先后顺序依次输入;

  • 多用户系统中,多个用户排成队,分时地循环使用CPU和主存;

  • 按用户的优先级排成多个队,每个优先级一个队列;

  • 实时控制系统中,信号按接受的先后顺序依次处理;

  • 网络电文传输,按到达的时间先后顺序依次进行。

3.1栈的相关概念

是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表。

又称为后进先出的线性表,简称LIFO结构。

表尾(即an端)称为栈顶Top;表头(即a1端)称为栈底Base。

插入元素到栈顶(即表尾)的操作,称为入栈

栈顶(即表尾)删除最后一个元素的操作,称为出栈

”入“=压入=PUSH(x) "出”=弹出=POP(y)

栈的操作特性:后进先出

3.2栈的总结

  1. 定义 限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作)

  1. 逻辑结构 与线性表相同,仍为一对一关系

  1. 存储结构 用顺序栈或链栈存储均可,但以顺序栈更常见

  1. 运算规则 只能在栈顶运算,且访问结点时依照后进先出(LIFO)的原则

  1. 实现方式 关键是编写入栈和出栈函数,具体实现依顺序栈和链栈的不同而不同

3.3栈与一般线性表有什么不同

栈与一般线性表的区别:仅在于运算规则不同

一般线性表

逻辑结构:一对一

存储结构:顺序表、链表

运算规则:随机存取

逻辑结构:一对一

存储结构:顺序栈、链栈

运算规则:后进先出(LIFO)

    • 队列

4.1队列的相关概念

队列是一种先进先出(First In First Out----FIFO)的线性表。在表一端插入(表尾),在另一端(表头)删除。

4.2队列的定义和特点

  1. 定义 只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表(头删尾插

  1. 逻辑结构 与线性表相同,仍为一对一关系

  1. 存储结构 顺序队链队,以循环顺序队列更常见

  1. 运算规则 只能在队首和队尾运算,且访问结点时依照先进先出(FIFO)的原则

  1. 实现方式 关键是掌握入队出队操作,具体实现依顺序队或链队的不同而不同

二、案例

    • 进制转换

十进制整数N向其它进制数d(二、八、十六)的转换是计算机实现计算的基本问题。

转换法则:除以d倒取余

该转换法则对应于一个简单算法原理:

n=(n div d)*d+n mod d

其中:div为整除运算,mod为求余运算

    • 括号匹配的检验

可以利用一个栈结构保存每个出现的左括号,当遇到右括号时,从栈中弹出左括号,检验匹配情况。

在检验过程中,若遇到以下几种情况之一,就可以得出括号不匹配的结论。

  1. 当遇到某一个右括号时,栈已空,说明到目前为止,右括号多于左括号

  1. 从栈中弹出的左括号与当前检验的右括号类型不同,说明出现了括号交叉情况;

  1. 算术表达式输入完毕,但栈中还有没有匹配的左括号,说明左括号多于右括号

    • 表达式求值

3.1引入

表达式求值是程序设计语言编译中一个最基本的问题,它的实现也需要运用栈。

这里介绍的运算是由运算符优先级确定运算顺序的对表达式求值算法

——算符优先算法

3.2表达式的组成

操作数:常数、变量。

运算符:算术运算符、关系运算符和逻辑运算符。

界限符:左右括弧和表达式结束符。

算术表达式:操作数(常数、变量)+算术运算符(+、-、*、/)+界限符(括号、表达式结束符’#‘、虚设的表达式起始符’#‘)

3.3求值过程

  1. 设置两个栈:

一个是算符栈OPTR,用于寄存运算符。

另一个称为操作数栈OPND,用于寄存运算数和运算结果。

2.求值处理过程是自左至右扫描表达式的每一个字符

(1)当扫描到的是运算数,则将其压入栈OPND;

(2)当扫描到的是运算符时:

  • 若这个运算符比OPTR栈顶运算符的优先级高,则入栈OPTR,继续向后处理

  • 若这个运算符比OPTR栈顶运算符优先级低,则从OPDND栈中弹出两个运算数,从栈OPTR中弹出栈顶运算符进行运算,并将运算结果压入栈OPND

(3)继续处理当前字符,直到遇到结束符为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值