第4章-2.栈的应用PPT资料.ppt
《第4章-2.栈的应用PPT资料.ppt》由会员分享,可在线阅读,更多相关《第4章-2.栈的应用PPT资料.ppt(30页珍藏版)》请在冰豆网上搜索。
![第4章-2.栈的应用PPT资料.ppt](https://file1.bdocx.com/fileroot1/2022-10/4/0676a9ab-e7cb-4d01-9255-8c2d9b55d87f/0676a9ab-e7cb-4d01-9255-8c2d9b55d87f1.gif)
,到来的右括弧非是所“期待”的;
例如:
考虑下列括号序列:
()12345678,到来的是“不速之客”;
直到结束,也没有到来所“期待”的括弧;
算法的设计思想:
1)凡出现左括弧,则进栈;
2)凡出现右括弧,首先检查栈是否空若栈空,则表明该“右括弧”多余否则和栈顶元素比较,若相匹配,则“左括弧出栈”否则表明不匹配,3)表达式检验结束时,若栈空,则表明表达式中匹配正确否则表明“左括弧”有余,Statusmatching(string.,例三背包问题(P70),假设有一个能装入总体积为T的背包和n件体积分别为w1,w2,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使wi1+wi2+wik=T,要求找出所有满足上述条件的解。
例如:
当T=10,各件体积为1,8,4,3,5,2时,可找到下列4组解:
(1,4,3,2)、(1,4,5)、(8,2)和(3,5,2)。
使用算法:
回溯法。
使用数据结构:
栈。
读懂P70图4.4:
各件下标:
0,1,2,3,4,5对应体积:
1,8,4,3,5,2图中所示为下标,需与对应的体积相印证。
物品体积:
(1,8,4,3,5,2)。
背包总体积10。
0,1,2,3,4,5,编号,体积,限于二元运算符的表达式定义:
表达式:
=(操作数)+(运算符)+(操作数)操作数:
=简单变量|表达式简单变量:
=标识符|无符号整数,例四、表达式求值,表达式的三种标识方法:
设Exp=S1+OP+S2,则称OP+S1+S2为前缀表示法,S1+OP+S2为中缀表示法,S1+S2+OP为后缀表示法,例如:
Exp=ab+(cd/e)f前缀式:
+abc/def中缀式:
ab+cd/ef后缀式:
abcde/f+,结论:
1)操作数之间的相对次序不变;
2)运算符的相对次序不同;
3)中缀式丢失了括弧信息,致使运算的次序不确定;
4)前缀式的运算规则为:
连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;
5)后缀式的运算规则为:
运算符在式中出现的顺序恰为表达式的运算顺序;
每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式;
如何从后缀式求值?
先找运算符,再找操作数,例如:
abcde/f+,ab,d/e,c-d/e,(c-d/e)f,如何从原表达式求得后缀式?
每个运算符的运算次序要由它之后的一个运算符来定,在后缀式中,优先数高的运算符领先于优先数低的运算符。
分析“原表达式”和“后缀式”中的运算符:
原表达式:
a+bcd/ef后缀式:
abc+de/f,从原表达式求得后缀式的规律为:
1)设立暂存运算符的栈;
2)设表达式的结束符为“#”,予设运算符栈的栈底为“#”,3)若当前字符是操作数,则直接发送给后缀式;
4)若当前运算符的优先数高于栈顶运算符,则进栈;
5)否则,退出栈顶运算符发送给后缀式;
6)“(”对它之前后的运算符起隔离作用,“)”可视为自相应左括弧开始的表达式的结束符。
从原表达式求得后缀式的规律为:
voidtransform(charsuffix,charexp)InitStack(S);
Push(S,#);
p=exp;
ch=*p;
while(!
StackEmpty(S)if(!
IN(ch,OP)Pass(Suffix,ch);
elseif(ch!
=#)p+;
elsePop(S,ch);
Pass(Suffix,ch);
/while/CrtExptree,switch(ch)case(:
Push(S,ch);
break;
case):
Pop(S,c);
while(c!
=()Pass(Suffix,c);
Pop(S,c)break;
defult:
while(Gettop(S,c)/switch,例五、迷宫求解,通常用的是“穷举求解”的方法,111,122,222,321,331,344,241,251,264,163,153,144,3,$,$,$,$,$,$,$,$,三元组(x,y,z)表示(行号,列号,下步走向)东南西北四个方向分别用1、2、3、4表示,求迷宫路径算法的基本思想是:
若当前位置“可通”,则纳入路径,继续前进;
若当前位置“不可通”,则后退,换方向继续探索;
若四周“均无通路”,则将当前位置从路径中删除出去。
设定当前位置的初值为入口位置;
do若当前位置可通,则将当前位置插入栈顶;
若该位置是出口位置,则算法结束;
否则切换当前位置的东邻方块为新的当前位置;
否则while(栈不空);
求迷宫中一条从入口到出口的路径的算法:
若栈不空且栈顶位置尚有其他方向未被探索,则设定新的当前位置为:
沿顺时针方向旋转找到的栈顶位置的下一相邻块;
若栈不空但栈顶位置的四周均不可通,则删去栈顶位置;
/从路径中删去该通道块若栈不空,则重新测试新的栈顶位置,直至找到一个可通的相邻块或出栈至栈空;
若栈空,则表明迷宫没有通路。
例六、实现递归,将所有的实在参数、返回地址等信息传递给被调用函数保存;
为被调用函数的局部变量分配存储区;
将控制转移到被调用函数的入口。
当在一个函数的运行期间调用另一个函数时,在运行该被调用函数之前,需先完成三项任务:
保存被调函数的计算结果;
释放被调函数的数据区;
依照被调函数保存的返回地址将控制转移到调用函数。
从被调用函数返回调用函数之前,应该完成下列三项任务:
多个函数嵌套调用的规则是:
此时的内存管理实行“栈式管理”,后调用先返回!
voidmain()voida()voidb()a();
b();
/main/a/b,Main的数据区,函数a的数据区,函数b的数据区,递归工作栈:
递归过程执行过程中占用的数据区。
递归工作记录:
每一层的递归参数合成一个记录。
当前活动记录:
栈顶记录指示当前层的执行情况。
当前环境指针:
递归工作栈的栈顶指针。
递归函数执行的过程可视为同一函数进行嵌套调用,例如:
例移汉诺(Hanoi)塔传说在创世纪时,在一个叫Brahma的寺庙里,有三个柱子,其中一柱上有64个盘子从小到大依次叠放,僧侣的工作是将这64个盘子从一根柱子移到另一个柱子上。
移动时的规则:
每次只能移动一个盘子;
只能小盘子在大盘子上面;
可以使用任一柱子。
当工作做完之后,就标志着世界末日到来。
分析:
设三根柱子分别为x,y,z,盘子在x柱上,要移到z柱上。
1、当n=1时,盘子直接从x柱移到z柱上;
2、当n1时,则设法将前n1个盘子借助z,从x移到y柱上,把盘子n从x移到z柱上;
把n1个盘子从y移到z柱上。
n,n1,voidhanoi(intn,charx,chary,charz)/将塔座x上按直径由小到大且至上而下编号为1至n/的n个圆盘按规则搬到塔座z上,y可用作辅助塔座。
1if(n=1)2move(x,1,z);
/将编号为的圆盘从x移到z3else4hanoi(n-1,x,z,y);
/将x上编号为至n-1的/圆盘移到y,z作辅助塔5move(x,n,z);
/将编号为n的圆盘从x移到z6hanoi(n-1,y,x,z);
/将y上编号为至n-1的/圆盘移到z,x作辅助塔78,