栈的应用举例.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
栈的应用举例

* * 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列 第三章 栈和队列 £3.2.1 数制转换 £3.2 栈的应用举例 十进制数N和其他d进制数的转换是计算机实现计算的基本问题,其解决 方法很多,其中一个简单算法基于下列原理: N = ( N div d ) × d + N mod d (其中:div为整除运算,mod为求余运算) 例如:(1348)10=(2504)8,其运算过程如下: N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2 由于上述计算过程是从低位到高位顺序产生八进制数的 各个数位,而打印输出,一般来说应从高位到低位进行,恰 好和计算过程相反。因此,若计算过程中得到八进制数的各 位顺序进栈,则按出栈序列打印输出的即为与输入对应的八 进制数。 算法3.1如下: void conversion ( ) { //对于输入的任意一个非负十进制整数, //打印输出与其等值的八进制数。 InitStack (S); //构造空栈 scanf (“%d”, N); while (N) { Push (S, N%8); N = N / 8; } while (!StackEmpty(s)) { Pop (S, e); printf (“%d”, e); } } //conversion £3.2.2 括号匹配检验 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套 的顺序随意,即( [ ] ( ))或[( [ ] [ ]) ]等为正确的格式,[ ( ] )或[ ( ) ) 或( ( ) ] )均为不正确的格式。检验括号是否匹配的方法可用“期待 的急迫程度”这个概念来描述。例如: [ ( [ ] [ ] ) ] 1234 567 8 当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号“[”只能暂时靠边,而迫切等待与第二个括号相匹配的、第七个括号”)”的出现,类似的,因等来的是第三个括号“[”,其期待匹配的程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号之后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配就成为当前最急迫的任务了,……,依次类推。可见,这个处理过程恰与栈的特点相吻合。由此,在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最急迫的期待得以消解,或者是不合法的情况;若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的栈中的所有未消解的期待的急迫性都降了一级。另外,在算法的开始和结束时,栈都应该是空的。 算法的设计思想: 1)凡出现左括弧,则进栈; 2)凡出现右括弧,首先检查栈是否空 若栈空,则表明该“右括弧”多余 否则和栈顶元素比较, 若相匹配,则“左括弧出栈” 否则表明不匹配 3)表达式检验结束时, 若栈空,则表明表达式中匹配正确 否则表明“左括弧”有余 Status matching(string exp) { int state = 1; while (i=Length(exp) state) { switch of exp[i] { case “(”:{Push(S,exp[i]); i++; break;} case”)”: { if(NOT StackEmpty(S)GetTop(S)=“(“ {Pop(S,e); i++;} else {state = 0;} break; } … … } if (StackEmpty(S)state) return OK; …... £3.2.

文档评论(0)

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

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

1亿VIP精品文档

相关文档