计算机编程中的不等式作业表的求值.docxVIP

计算机编程中的不等式作业表的求值.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机编程中的不等式作业表的求值 表达方法是句子语言编译中最基本的问题。通常书写的算术表达式是由操作数和运算符以及改变运算次序的圆括号连接而成的式子。运算符包括单目运算符和双目运算符两类,单目运算符只要求一个操作数,并被置于该操作数的前面,双目运算符要求有两个操作数,其位置因表示方法不同而有所差异。按照运算符与运算对象的位置关系,算术表达式的表示方法分为前缀表达式、中缀表达式和后缀表达式三种,其中后两者较为常用。为了简便起见,在本文的讨论中只考虑双目运算符(仅+、-、*、/四种)以及括号。 1 运算符的转换 中缀算术表达式最为常见,其双目运算符置于与之相关的两个运算对象之间。对中缀表达式的求值,并非按照运算符出现的自然顺序来执行其中的各个运算,而是根据算符间的优先关系来确定运算的次序,此外,还需要顾及括号规则。中缀表达式的计算比较复杂,它必须遵守以下三条规则: 1)先计算括号内,后计算括号外; 2)在无括号或同层括号内,先乘除运算,后加减运算,即乘除运算的优先级高于加减运算的优先级; 3)同一优先级运算,从左向右依次进行。 从以上规则可以看出,在中缀表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。因此,各运算符实际的运算次序往往同它们在表达式中出现的先后次序是不一致的,是不可预测的。中缀算术表达式符合人的思维方式,我们凭直观判别一个中缀表达式中运算符运算顺序并不困难,但对于计算机处理起来就比较复杂了。由于传统计算机一维的计算模型,只能一个字符一个字符地扫描,要想确定哪一个运算符优先计算,就必须对整个中缀表达式扫描一遍,一个中缀表达式中有多少个运算符,原则上就需要扫描多少遍才能计算完毕,这样算法的时间复杂性就差了,显然是不可取的。 那么,能否把中缀算术表达式转换成另一种形式的算术表达式,使计算简单化呢?回答是肯定的。波兰科学家卢卡谢维奇(J Lukasiewicz)很早就提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。采用后缀表示的算术表达式被称为后缀算术表达式或后缀表达式。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需扫描一遍表达式便可完成,显然比中缀表达式的计算要简单得多。例如,对于后缀表达式“12◆4◆–◆5◆/”,其中‘◆’字符表示成分之间的空格,因减法运算符在前,除法运算符在后,所以应先做减法,后做除法;减法的两个操作数是它前面的12和4,其中第一个数12是被减数,第二个数4是减数;除法的两个操作数是它前面的12减4的差(即8)和5,其中8是被除数,5是除数。 那么中缀算术表达式转换成对应的后缀算术表达式的基本思想是什么呢?其实很简单,就是把每个运算符都移到它的两个运算对象之后,而后删除掉所有的括号即可。 实际上J.Lukasiewicz最先提出的是表达式的前缀表示方法,即把每一个运算符置于运算对象之前,例如表达式“10+(20-5*3)(13-8)”其前缀表示形式为“+10/-20*5 3-13 8”。前缀表达式的优点与后缀表达式的相同,也不含有括号,表达式中的运算也是按照运算符出现的顺序进行的,计算也很容易实现。但由于其表示方法与人们的习惯相差甚远,因而并不常用。 对于简单的中缀表达式我们很容易得到其后缀表达式,但对于较为复杂的中缀表达式就很难从直观上得到其后缀表达式。 我们可以用一棵二叉树来表示算术表达式,非终端结点表示运算符,终端(叶子)结点代表运算对象,如10+(20-5*3)/(13-8),那么按照先序、中序、后序遍历二叉树,就可以分别得到前缀、中缀和后缀算术表达式。如此可以很方便地实现三种算术表达式的相互转换。 用计算机又是怎样实现它们之间的转化的呢?以下是自然语言描述的表达式转前缀算法: 1)求输入串的逆序。 2)检查输入的下一元素。 3)假若是操作数,把它添加到输出串中。继续输入下一个字符。 4)假若是闭括号(‘)’),将其入栈。继续输入下一个字符。 5)假如是运算符,则 ①假如栈空,此运算符入栈。继续输入下一个字符。 ②假如栈顶是闭括号,此运算符入栈。继续输入下一个字符。 ③假如它的优先级高于或等于栈顶运算符,此运算符入栈。继续输入下一个字符。 ④否则,栈顶运算符出栈并添加到输出串中,重复步骤5)。 6)假如是开括号(‘(’),栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。继续输入下一个字符。 7)假如输入还未完毕,跳转到步骤2)。 8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。 9)求输出串的逆序。 假设我们要将表达式“2*3/(2-1)+5*(4-1)”转换成前缀形式,原表达式的逆序是“)1-4(*5+)1-2(/

文档评论(0)

xcwwwwws + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档