ch3-2栈的应用资料.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 例1: 数制转换—— 见教材P48 设计思路:用栈暂存低位值 例2:括号匹配的检验————见教材P49 设计思路:用栈暂存左括号 例3 :表达式求值(自学)-————见教材P52 设计思路:用栈暂存运算符 例4:汉诺(Hanoi)塔(自学)-------材P55 设计思路:用栈实现递归调用 栈的应用举例 * 例如:(1348)10 = (2504)8 , 其运算过程如下: N N / 8 N% 8 1348 168 4 168 21 0 21 2 5 2 0 2 计算顺序 输出顺序 算法基于原理: N = (N div d)×d + N mod d 例1: 数制转换——见教材P48 设计思路:用栈暂存低位值 * void conversion () { InitStack(S); scanf (“%u”,N);//输入非负整数 while (N) { Push(S, N % 8);//入栈N除以8的余数,得8进制的低位; N = N/8; } while (!StackEmpty(S)) { Pop(S,e);//弹出栈顶元素且付给e; printf ( %d, e ); } } // conversion * 算法的设计思想: 1)凡扫描到(,[,}时,则进栈; 2)凡出现),],}时判断,是否是匹配的括号。 首先检查栈是否空 若栈空,则表明该“右括弧”多余,报错; 否则和栈顶元素比较, 若相匹配,则“左括弧出栈”; 否则,报错。 3)表达式检验结束时, 若栈空,则表明表达式中匹配正确; 否则表明“左括弧”有余,报错。 例2:括号匹配的检验————见教材P49 设计思路:用栈暂存左括号 此例作为上机实验题 * * [([][])] Status match(char *str) { InitStack(S); for(p=str; *p; p++){ switch(*p){ case ‘(‘: case ‘[‘: case ‘{‘: Push(S, *p); break; case ‘)’: Pop(S, e); if(e != ‘(‘) return ERROR; break; case ‘]’: Pop(S, e); if(e != ‘[‘) return ERROR; break; case ‘}’: Pop(S, e); if(e != ‘{‘) return ERROR; }//switch } //for if(StackEmpty(S)) return OK; } * 操作数(operand) 、运算符(operator )、界限符(delimiter 左右括号和表达式结束符),运算符和界限符统称算符。 #(7+15)*(23-28/4)# (1) 从左算到右;  (2) 先乘除, 后加减;  (3) 先括号内, 后括号外。 OPND栈和OPTR栈 操作数入OPND栈,算符入OPTR栈 表达式求值(算符优先算法) 例3 :表达式求值 —-————见教材P52(后缀式) * θ1θ2,表明不能进行θ1 的运算,θ2 入栈,读 下一字符。 θ1θ2,表明可以进行θ1 的运算,θ1退栈,运算,运算结果入栈。 θ1=θ2,脱括号,读下一字符或表达式结束。 * #3*(7-2)# 步骤 OPTR栈 OPND栈 输入字符 主要操作 # 3*(7-2)# PUSH(OPND,’3’) # 3 *(7-2)# PUSH(OPTR,’*’) #* 3 (7-2)# PUSH(

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档