|
|
|
|
移动端

3.6.3 应用(1)

《数据结构与算法分析:Java语言描述(原书第3版)》第3章表、栈和队列,本章讨论最简单和最基本的三种数据结构。实际上, 每一个有意义的程序都将显式地至少使用一种这样的数据结构, 而栈则在程序中总是要被间接地用到, 不管我们在程序中是否做了声明。本节为大家介绍应用。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 17:44

【新品产上线啦】51CTO播客,随时随地,碎片化学习

3.6.3 应用(1)

毫不奇怪, 如果我们把操作限制在对一个表上进行, 那么这些操作会执行得很快。然而, 令人惊奇的是, 这些少量的操作非常强大和重要。在栈的许多应用中, 我们给出三个例子, 第三个实例深刻说明程序是如何组织的。

平衡符号

编译器检查程序的语法错误, 但是常常由于缺少一个符号(如遗漏一个花括号或是注释起始符)引起编译器列出上百行的诊断, 而真正的错误并没有找出。(幸运的是, 大部分Java编译器在这一点上是相当好的。但不是所有的语言和编译器都这么可靠。)

在这种情况下,一个有用的工具就是检验是否每件事情都能成对的程序。于是, 每一个右花括号、 右方括号及右圆括号必然对应其相应的左括号。序列[()]是合法的, 但[( ] )是错误的。显然, 不值得为此编写一个大型程序, 事实上检验这些事情是很容易的。为简单起见, 我们仅就圆括号、 方括号和花括号进行检验并忽略出现的任何其他字符。

这个简单的算法用到一个栈, 叙述如下:

做一个空栈。读入字符直到文件结尾。84如果字符是一个开放符号, 则将其推入栈中。如果字符是一个封闭符号, 则当栈空时报错。否则, 将栈元素弹出。如果弹出的符号不是对应的开放符号, 则报错。在文件结尾, 如果栈非空则报错。

我们应该能够确信这个算法是会正确运行的。很清楚, 它是线性的, 事实上它只需对输入进行一趟检验。因此, 它是联机(on-line)的, 是相当快的。当报错时决定如何处理需要做一些附加的工作——例如判断可能的原因。

后缀表达式

假设我们有一个便携式计算器并想要计算一趟外出购物的花费。为此, 我们将一列数据相加并将结果乘以1.06; 它是所购物品的价格以及附加的地方销售税。如果购物各项花销为4.99、 5.99和6.99, 那么输入这些数据的自然的方式将是

4.99+5.99+6.99*1.06=

随着计算器的不同, 这个结果或者是所要的答案19.05, 或者是科学答案18.39。最简单的四功能计算器都将给出第一个答案, 但是许多先进的计算器是知道乘法的优先级高于加法的。

另一方面, 有些项是需要上税的而有些项则不是, 因此, 如果只有第一项和最后一项是要上税的, 那么计算的顺序

4.99*1.06+5.99+6.99*1.06=

将在科学计算器上给出正确的答案(18.69)而在简单计算器上给出错误的答案(19.37)。科学计算器一般包含括号, 因此我们总可以通过加括号的方法得到正确的答案, 但是使用简单计算器我们需要记住中间结果。

该例的典型计算顺序可以是将4.99和1.06相乘并存为A1, 然后将5.99和A1相加, 再将结果存入A1; 我们再将6.99和1.06相乘并将答案存为A2, 最后将A1和A2相加并将最后结果放入A1。我们可以将这种操作顺序书写如下:

4.99 1.06*5.99+6.99 1.06*+

这个记法叫作后缀(postfix)或逆波兰(reverse Polish)记法, 其求值过程恰好就是上面所描述的过程。计算这个问题最容易的方法是使用一个栈。当见到一个数时就把它推入栈中; 在遇到一个运算符时该算符就作用于从该栈弹出的两个数(符号)上, 再将所得结果推入栈中。例如, 后缀表达式

6 5 2 3+8*+3+*

计算如下: 前四个字符放入栈中, 此时栈变成

下面读到一个‘+’号, 所以3和2从栈中弹出并且它们的和5被压入栈中

接着, 8进栈

现在见到一个‘*’号, 因此8和5弹出并且5*8=40进栈

接着又见到一个‘+’号, 因此40和5被弹出并且5+40=45进栈

现在将3压入栈中86

然后‘+’使得3和45从栈中弹出并将45+3=48压入栈中

最后, 遇到一个‘*’号, 从栈中弹出48和6; 将结果6*48=288压进栈中


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

PHP5与MySQL5 Web开发技术详解

本书是目前中文版本第一个真正介绍PHP 5及MySQL 5新增语法与功能的权威宝典! 本书本着精、全、要三宗旨,从理论中延伸,从实践中深入,详...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊