族谱网 头条 人物百科

逆波兰表示法

2017-10-16
出处:族谱网
作者:阿族小谱
浏览:673
转发:0
评论:0
解释逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“34+”,而不是“3+4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3-4+5”在逆波兰记法中写作“34-5+”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3-4*5”与“(3-4)*5”不相同,但后缀记法中前者写做“345*-”,无歧义地表示“3(45*)−”;后者写做“34-5*”。逆波兰表达式的解释器一般是基于堆栈的。解释过程一般是:操作数入栈;遇到操作符时,操作数出栈,求值,将结果入栈;当一遍后,栈顶就是表达式的值。因此逆波兰表达式的求值使用堆栈结构很容易实现,并且能很快求值。注意:逆波兰记法并不是简单的波兰表达式的反转。因为对于不满足交换律的操作符,它的操作数写法仍然是常规顺序,如,波兰记法“/63”的逆波兰记法是“63/”而不是“36/”;数字

解释

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) −”;后者写做“3 4 - 5 *”。

逆波兰表达式的解释器一般是基于堆栈的。解释过程一般是:操作数入栈;遇到操作符时,操作数出栈,求值,将结果入栈;当一遍后,栈顶就是表达式的值。因此逆波兰表达式的求值使用堆栈结构很容易实现,并且能很快求值。

注意:逆波兰记法并不是简单的波兰表达式的反转。因为对于不满换律的操作符,它的操作数写法仍然是常规顺序,如,波兰记法“/ 6 3”的逆波兰记法是“6 3 /”而不是“3 6 /”;数字的数位写法也是常规顺序。

与中缀记法的转换

艾兹格·迪科斯彻引入了调度场算法,用于将中缀表达式转换为后缀形式。因其操作类似于火车编组场而得名。 大多数操作符优先级解析器(解析器用简单的查表操作即可实现,优先级表由开发者自己定制,在不同的应用场景中,开发者可自由改变操作符的优先级)能转换为处理后缀表达式,实际中,一般构造抽象语法树,树的后序遍历即为逆波兰记法。

逆波兰表达式求值

伪代码

while有输入符号

IF栈内只有一个值

ELSE多于一个值

例子

中缀表达式“5 + ((1 + 2) * 4) − 3”写作

下表给出了该逆波兰表达式从左至右求值的过程,堆栈栏给出了中间值,用于跟踪算法。

计算完成时,栈内只有一个操作数,这就是表达式的结果:14

上述运算可以重写为如下运算链方法(用于HP的逆波兰计算器):

实现

第一代实现了逆波兰架构的电子计算机是英国电气公司1963年交付使用的KDF9和美国的Burroughs B5000。Friden公司在它1963年推出的EC-130中,将逆波兰表达式引入了台式计算器市场。惠普1968年设计了9100A逆波兰计算器,首台手持式计算器HP-35也使用逆波兰表达式,惠普在HP-10A之前的所有手持计算器(包括科学计算,金融和可编程)中使用了逆波兰表达式,并在1980年代晚期的LCD显示计算器如HP-10C, HP-11C, HP-15C, HP-16C,等都是用了逆波兰表达式。

实际意义

当有操作符时就计算,因此,表达式并不是从右至左整体计算而是每次由中心向外计算一部分,这样在复杂运算中就很少导致操作符错误。

堆栈自动记录中间结果,这就是为什么逆波兰计算器能容易对任意复杂的表达式求值。与普通科学计算器不同,它对表达式的复杂性没有限制。

逆波兰表达式中不需要括号,用户只需按照表达式顺序求值,让堆栈自动记录中间结果;同样的,也不需要指定操作符的优先级。

逆波兰计算器中,没有“等号”键用于开始计算。

逆波兰计算器需要“确认”键用于区分两个相邻的操作数。

机器状态永远是一个堆栈状态,堆栈里是需要运算的操作数,栈内不会有操作符。

教育意义上,逆波兰计算器的使用者必须懂得要计算的表达式的含义。

目前逆波兰的实现有:

任何基于栈的程序语言:

线上的逆波兰计算器

Windows下逆波兰计算器

Windows XP下的Microsoft PowerToy calculator

手机逆波兰计算器开源的JAVA计算器

Palm PDA下的逆波兰计算器

Mac OS X计算器

Mac OS X和iPhone下的逆波兰计算器

Unix下的计算程序dc

交互式JavaScript的逆波兰计算器:[2]和[3]

Wikibooks:Ada Programming/Mathematical calculations(Ada语言中的逆波兰计算器)

Emacs的lisp lib包: calc

基于GTK+的galculator

表达式转换[4]

参见

Forth

PostScript

HP计算器

LIFO

栈机器(Stack machine)

波兰表示法



免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

文章来源:内容词条
——— 没有了 ———
编辑:阿族小谱

更多文章

更多精彩文章
评论 {{commentTotal}} 文明上网理性发言,请遵守《新闻评论服务协议》
游客
发表评论
  • {{item.userName}} 举报

    {{item.content}}

    {{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}

    回复评论
加载更多评论
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回
打赏
私信

推荐阅读

· 波兰表示法
算术形式表达“三加四”时,前缀记法写作“+34”,而不是“3+4”。在复杂的表达式中,操作符仍然在操作数的前面,但操作数可能是包含操作符的平凡表达式。例如,如下的前缀表达是:或省略括号:由于简单的算术运算符都是二元的,该前缀表达式无需括号,且表述是无歧义的。在前面的例子里,中缀形式的括号是必需的,如果将括号移动到:即:则会改变整个表达式的值。而其正确的前缀形式是:减法运算要等它的两个操作数(5;6和7的乘积)都完成时才会处理。在任何表示法中,最里面的表达式最先运算,而在波兰表达式中,决定“最里面”的是顺序而不是括号。简单算术的前缀表达式主要是用于学术研究方面。与逆波兰表示法不同,前缀表达式基本没有在商业计算器中使用过,但是其体系经常在编译器构造的概念教学中首先使用。计算机编程LISP的S-表达式中广泛地使用了前缀记法,S-表达式中使用了括号是因为它的算术操作符有可变的元数(arity)。逆...
· 加法逆元
一般定义设“+”为一个交换性的二元运算,即对于所有x,y,x+y=y+x。若该集内存在一个元素0,使得对于所有x,x+0=0+x=x,则此元素是唯一的。如果对于一个给定的x,存在一个x"使得x+x"=x"+x=0,则称x"是x的加法逆元。特殊情况定义若“+”符合结合律,则任意数的加法逆元是唯一的。证明反证法:设x{\displaystylex}有两个相异的加法逆元x1{\displaystylex_{1}}、x2{\displaystylex_{2}}有x=x+0{\displaystylex=x+0}的关系。⇒0=x+x1=x+x2{\displaystyle0=x+x_{1}=x+x_{2}}⇒x1=x2{\displaystylex_{1}=x_{2}}产生矛盾,证讫。例向量空间:标量乘法-1欧几里得空间:以原点为中心的反演变换
· 康威多面体表示法
多面体的运算下面列出康威多面体表示法中,多面体的运算符号,那些运算通常类似几何变换,并以(v,e,f)表示进行该运算或操作后多面体的变化。这些运算符号的运算优先级皆为由右至左。例如:正四面体的对偶多面体计为dT;截角的正方体应计为t3C或tC;截角的截半立方体应计为t4aC或taC。所有的操作都保有对称性,除了s和g是扭曲的像并失去了镜射对称。例子生成标准种子所有的五个正多面体皆可以从棱柱种子经过零至两个运算或操作而产生:锥体:Y3(正四面体是一个特别的角锥)反柱体:A3(正八面体是一个特别的反柱体)柱体:P4(正方体是一个特别的柱体)五角反棱柱:A5康威的符号扩展上述的运算和操作可以从正多面体种子或柱体锥体的种子产生所有的半正多面体、卡塔兰立体、柏拉图立体和阿基米德立体。许多多面体都可由高阶的组合操作还表示,但是某些特别的多面体需要更多的符号来表示。例如,几何艺术家GeorgeW.Har...
· 小波兰
地理小波兰位于维斯瓦河上游,包括大量高地,包括圣十字山,小波兰高地,桑多梅日盆地和卢布林高地。它从喀尔巴阡山脉延伸到皮里查河和维尔普斯河。北邻马佐夫舍,最北方与波德拉奇亚相邻,西靠西里西亚,南邻斯洛伐克,东临乌克兰(红鲁塞尼亚)。从历史上看,直到第二次世界大战,该地区也包括现在乌克兰的大部分地区(参见加利西亚)。小波兰——波兰立陶宛联邦行省,在1635年最大扩张期间小波兰(德语:Kleinpolen)——波兰立陶宛联邦行省,1660年以前在波兰立陶宛联邦,小波兰省(波兰语:prowincjamałopolska)包括正统的小波兰,波德拉奇亚,红鲁塞尼亚,沃尔希连,波多里亚,乌克兰和切尔尼戈夫省;首府:克拉科夫。从行政方面上讲,历史地区被分为下面几个省:小波兰,喀尔巴阡山,圣十字,卢布林,上西里西亚东部,马佐夫舍和罗兹省东部。主要城镇该地区最主要城市包括:克拉科夫利沃夫(现在属于乌克兰)以及...
· 表示论
定义和概念设V{\displaystyleV}为域F{\displaystyleF}上的向量空间。例如,设V{\displaystyleV}为Rn{\displaystyle\mathbb{R}^{n}}或Cn{\displaystyle\mathbb{C}^{n}},即标准n{\displaystylen}-维实/复列向量空间。这种情况下,表示论的思路是运用n××-->n{\displaystylen\timesn}实/复矩阵具体地处理抽象代数。这种处理方法主要可以用于三种代数对象:群、结合代数及李代数。可逆n××-->n{\displaystylen\timesn}矩阵的集矩阵乘法阵乘法形成一个群,而群表示则是通过用可逆矩阵来描述(即“表示”)群的元素以分析群的性质。配以矩阵加法和乘法,所有n××--&...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信