本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。
一方面用于学习记录与分享,
另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。
如有侵权,请留言作删文处理。
课程视频链接:
数据结构与算法基础–第05周04–3.2案例引入
📚 【Week05】04_栈和队列的案例引入
案例一:进制转换
十进制整数 N 向其他进制数 d (二、八、十六)的转换是计算机实现计算的基本问题。
转换法则:除以 d 倒取余
该转换法则对应于一个简单算法原理:
其中:div 为整除运算,mod 为求余运算。
例如:把十进制数 159 转换成八进制数
运用栈解决求余过程
案例二:括号匹配的检验
假设表达式中允许包含两种括号:圆括号和方括号
其嵌套的顺序随意,即:
(1) ( [] () ) 或 [ ([] []) ] 为正确格式
(2) [( ]) 为错误格式;
(3) ([ ()) 或 (() ]) 为错误格式。
例如:检验 (() ]) 是否匹配
案例三:表达式求值
表达式求值是程序设计语言编译中一个最基本的问题,它的实现也需要用栈。
这里介绍的算法是由运算符优先级确定运算顺序的对表达式求值算法——算符优先算法。
表达式的组成
(1) 操作数(operand):常数、变量。
(2) 运算符(operator):算术运算符、关系运算符和逻辑运算符。
(3) 界限符(delimiter):左右括弧和表达式结束符。
任何一个算术表达式都由操作数(常数、变量)、算术运算符(+、-、*、/)和界限符(括号,表达式结束符 ‘#’、虚设的表达式起始符 ‘#’)组成。后两者统称为算符。
例如:
# 3 *(7 - 2)#
为了实现表达式求值。需要设置两个栈:
-
一个是算符栈 OPTR,用于寄存运算符。
-
另一个称为操作数栈 OPND,用于寄存运算数和运算结果。
求值的处理过程是自左至右扫描表达式的每一个字符
(1) 当扫描到的是运算数,则将其压入栈 OPND,
(2) 当扫描到的是运算符时
-
若这个运算符比 OPTR 栈顶运算符的优先级高,则入栈 OPTR,继续向后处理
-
若这个运算符比 OPTR 栈顶运算符的优先级低,则从 OPND 栈中弹出两个运算数,从 OPTR 中弹出栈顶运算符进行运算,并将运算结果压入栈 OPND。
(3) 继续处理当前字符,直到遇到结束符为止。
案例四:舞伴问题
假设在舞会上,男士和女士各自排成一队。舞会开始时依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
显然,先入队的男士或女士先出队配成舞伴。因此该问题具有典型的先进先出特性,可以用队列作为算法的数据结构。
(1) 首先构造两个队列
(2) 依次将队头元素出队配成舞伴
(3) 某队为空,则另外一队等待着则是下一舞曲第一个可获得舞伴的人。