栈应用:进制转换
十进制整数N向其它禁止数d(二、八、十六)的转换。
转换法则:除以d倒取余
n=(n div d)*d+n mod d
div:整除 mod:求余
实现逻辑,将每一次的余数进栈,全部完毕后出栈。
栈应用:括号匹配的检验
( [] () )或( { [ ] } )括号左右可以匹配上,正确;
[ ( ] )只能嵌套不可以交叉,错误;
( [ ( ) )括号数量不对,格式错误。
检验( ( ) ] )是否匹配
1、((左括号)进栈
2、((左括号)进栈
3、)(右括号)于栈顶括号进行匹配,看看是否可以匹配上,匹配上就将栈顶右括号出栈
4、](右括号)与栈顶对比,不匹配
栈应用:表达式求值
表达式求值是程序设计语言编译中最基本的问题之一,它的实现也需要运用栈。
由运算符优先级确定运算顺序,例:# 3 * (7-2) #(一对#为界限符,表示表达式开始结束)
实现这个过程需要两个栈,一个是算符栈,另一个称为操作数栈
- 求值的处理过程是自左至右扫描表达式的每一个字符,当扫描到的是运算数,压栈到算符栈,继续向后处理
- 若这个运算符比算符栈的优先级低,则从操作数栈弹出两个操作数,从算符栈弹出栈顶运算符进行计算,将结果压入操作数栈
- 一直到结束符为止
队列应用:舞伴问题
假设在舞会上,男士和女士各自排成一队。舞会开始时,一次从两个队伍各出1人配成舞伴。两队人数不同,则较长一队未配对者等待下一轮。
本问题有一个先入先出特性,所以可以用队列作为算法的数据结构。
- 首先构造两个队列
- 一次将队头元素出队配成舞伴
- 某队为空,则另外一对等待着则是下一舞曲第一个可获得舞伴的人。