【案例1】进制转换
- 十进制整数N向其他进制数d(二、八、十六)的转换是计算机实现计算基本问题
转换法则:除以d倒取余
该转换法则对应一个简单算法原理:
n=(n div d)*d +n mod d
其中:div为整除运算,mod为求余运算 - 把十进制数159转换成八进制数。
这里需要用到栈中的是:将得到的的结果732输入栈中得到了237
【案例2】括号匹配的检验
- 假设表达式中允许包含两种括号:圆括号和方括号
- 其嵌套的顺序的随意,即:
1、([] ())或[( [] [] )]为正确格式;
2、[ ( ] )为错误格式;
3、( [ ( ) )或( ( ) ] ) 为错误格式 - 例如检验( ( ) ] ) 是否匹配?
解题步骤:
1、首先是将第一个元素进行入栈操作。
2、将第二个元素进行入栈操作,在执行之前得与栈顶元素进行匹配,匹配成功则将两个元素进行出栈操作,匹配不成功则进行之后的入栈操作。
3、最后将判断栈是否为空,空则说明,所有括号匹配成功,不为空则失败
【案例3】表达式求值
- 表达式求值是程序设计语言中一个最基本的问题,它的实现也需要运用到栈
- 这里介绍的算法是由运算符优先级确定运算顺序的对表达式求值算法——算符优先算法
- 表达式的组成
- 操作数(operand):常数、变量
- 运算符(operator):算术运算符、关系运算符和逻辑运算符。
- 界限符(delimiter):左右括弧和表达式结束符(表达式结束符和开始符都是"#")。
- 例如:#3*( 7 - 2 )#
为了实现表达式求值。需要设置两个栈:
一个是算符栈OPTR,用于寄存运算符。
另一个称为操作书栈OPND,用于寄存运算数和运算结果。
求值的处理过程是自左至右扫描表达式的每一个字符
·当扫描到的是运算数,则将其压入栈OPND
·当扫描到的是运算符时
·若这个运算符比OPTR栈顶运算符优先级高,则入栈OPTR,继续向后处理
·若这个运算符比OPTR栈顶运算符优先级低,则从OPND栈中弹出两个运算数, 从栈OPTR中弹出栈顶运算符进行计算,并将运算结果压入栈OPND
·继续处理当前字符,直到遇到结束符为止。 - 运算符优先级是 ()、*/、+-
【案例4】舞伴问题
- 假设在舞会上,男士和女士各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。先要求写一算法模拟上述舞伴配对问题。
- 显然,先入队的男士或女士先出队配成舞伴。因此该问题具有典型的先进先出特性,可以用队列作为算法的数据结构