计算机软件

RPN:算法,方法和实例

RPN一旦形成一个电脑程序员在世界的基础。 今天,它是不那么广为人知。 因此,漫画插图,描绘以外的“反向”波兰香肠卷,仍然可以由一些知识渊博的程序员误解。 不能很好地解释了笑话,但在这种情况下,这将是完全合理的。

中缀

所有的程序员,和大多数学生都熟悉使用运营商。 例如,对于变量x和y使用加号表达式x +求和值。 少为人知的是,这是从数学符号,称为中间符号借来的,其实是机器的一个大问题的事实。 这个操作符作为输入接收两个值都记录在左侧和右侧。 在节目的符号与标志操作可选择使用。 例如,X + Y可被写为倍(X,Y)的函数,其中,所述编译器,并最终转换缀表示法。 然而,大家都知道数学是太好不使用算术表达式,它形成一种内部小型的语言在几乎所有的编程语言。

公式翻译

第一真正成功的Fortran程序设计语言已经变得如此,主要是因为算术表达式(即式..)它在代码转换(广播),它故名 - 公式翻译。 在此之前,他们必须写,例如,在函数的形式折叠(和乘(B,C))。 在实现自动转换公式的COBOL问题被认为是非常困难的,因为程序员不得不写东西喜欢A添加至B的Mutliply通过C.

什么是错的缀?

问题是,该运营商有这样性质的优先级和结合。 正因为如此,中缀函数的定义变得不平凡的任务。 例如,乘法的优先级高于加法或减法,这意味着表达2 + 3 * 4不等于2和3的和,乘以4,因为这将是在运营商的性能从左到右。 事实上,乘以4 3,并添加2本实施例说明的是,缀表达式的计算通常需要在操作员和操作数的顺序的改变。 此外,有必要使用大括号看起来更清晰的符号。 例如,(2 + 3)*(4 + 5)不能被没有括号写的,因为2 + 3 * 4 + 5意味着需要通过4乘以3,并添加2和5。

在要计算运营商的订单需要一个漫长的记忆。 正因为如此,谁开始学习算术,往往学生得到错误的结果,即使实际操作正确执行。 有必要通过心脏教行动语句的顺序。 首先,动作必须在括号,然后乘法和除法,最后加减进行。 但有写数学表达式中缀表示法是唯一可以添加更多的可能的“小语种”之一的另一种方式。

前缀和后缀表示法

最知名的替代品二是之前或之后的操作数,记录操作员。 他们被称为前缀和后缀符号。 逻辑学家扬·卢凯西维奇发明于1920年的第一个。 他住在波兰,这样的记录被称为波兰。 Postfix的版本,分别称为逆波兰式(ARF)。 这两种方法之间的唯一差别是,在其中读取的记录(从左至右或从右到左)的方向,所以它足以详细只考虑其中的一个。 该OPN算它的操作数后写的。 因此,表达式AB +表示为A + B.示例RPN

操作数的数量不受限制

符号的直接好处是,它总结了正进制运营商和中缀表示法实际上只有两个操作数的作品,T。E.只对二进制操作本质上适合。 例如,ABC @是使用三元标记,是A,B和C的最大值。在这种情况下,操作者作用在三个操作数本身的左侧和对应于一个函数调用@的逆波兰表达式(A,B,C)。 如果您尝试写的@符号作为中缀,如A @ BC或类似的东西,它变得清晰,它根本不起作用。

通过如下顺序优先

RPN具有另一个优点,所述运营商的优先级可以通过它们出现的顺序来表示。 与此同时永远不需要括号,但它们可以作为字符操作,以便于从缀表示法的转换。 例如,AB + C * - 明确的当量(A + B)×C,所以乘法不能直到执行的相加,其给出用于乘法的第二操作数来计算。 也就是说,如果计算出的AB + C *通过一次一个操作员,我们得到AB + C * - >(AB +)* C - >(A + B)* C.

计算算法

OPN的操作看起来一样需要作为参数的两个值写在她的左功能。 此外,它是用于在编程语言中使用的天然符号,作为其计算的方式对应于所述栈操作和需要解析被消除。 例如,在表达式5 + 6 * 7避雷器将显示为5,6,7 *,+,它可以简单地通过扫描从左至右被计算并且在堆叠写的值。 每当操作的共同的标志,由所述计算机存储器的上部元件2中选择,使用操作者和将结果返回到存储器。 当计算表达式的最终结果将是在堆栈的顶部。

例如:

  • S =()5,6,7,*,+ 5放置在栈上。
  • S =(5)6,7,*,+ 6放置在栈上。
  • S =(5,6),7 *,7 +放置堆栈。
  • S =(5,6,7),* 2 +选择从堆栈,使用*值,并将结果置于堆栈中。
  • S =(5,6 * 7)=(5,42)+从堆栈选择的,以应用+和结果放在堆2倍的值。
  • S =(5 + 42)=(47)计算完成,结果被存储在堆栈的顶部。

该算法可以反复检查RPN,但每次它会工作,无论多么复杂的算术表达式。

OPN和堆栈有着密切的联系。 该实施例证实了如何使用存储器来计算逆波兰表示法的值。 不太明显的是,你可以使用堆栈,急性肾功能衰竭的转换标准中缀表达。

编程语言的例子

帕斯卡RPN实现这样的(示出了该程序的一部分)。

在被调用过程的周期,它决定是否令牌数或符号操作中读取的数和运算符。 在第一种情况下,执行存储在所述堆栈中的值,和两个上堆叠号码对应的动作的第二和的结果被存储。

toktype:= NUM;

读取(多个);

如果c在[ '+', ' - ', '*', '/']然后开始

如果EOLN然后CN:= '' 别的读(CN);

如果CN =“”然后

的情况下,

'+':Toktype:=添加; ' - ':toktype:=子;

'*':Toktype:= MUL; '/':Toktype:= DIV

结束

别人开始

若a = ' - ' 然后SGN:= -1否则错误:= C <> '+';

用:= CN

结束

结束;

如果(未误差)和(toktype = NUM)然后getnumber;

如果toktype <> NUM然后开始

Y =弹出; X:=弹出;

如果没有错误,则

的情况下toktype

添加:Z:= X + Y; 子:Z:= X-Y; MUL:Z:= X * Y; 格:Z:= x / y的

结束

推(Z);

C-实施RPN(程序的示出部分):

为(S = strtok的(S,W); S; S = strtok的(0,W)){

一个= strtod转换(S,E);

如果(E> S)推(a)的

的#define rpnop(X)的printf( “%C:”,* S),B = pop()方法中,a = pop()方法,推(x)的

否则,如果(* S == '+')rpnop(A + B);

否则,如果(* S == ' - ')rpnop(一 - 二);

否则,如果(* S == '*')rpnop(A * B);

否则,如果(* S == '/')rpnop(A / B);

和#undef rpnop

}

硬件实现

在那些日子里,当计算机技术是非常昂贵的,它被认为是一个好主意,迫使人们使用避雷器。 1960年当中。和现在一样,有可能购买的计算器,这在逆波兰式的工作。 要添加2,其中3必须输入2,然后是3,然后按“加号”按钮。 乍一看,输入操作数的操作显得复杂难记,但经过一段时间有些沉迷于这种思维方式和无法理解为什么别人坚持愚蠢缀,这是如此复杂,如此有限。

巴勒斯公司甚至建立了一个主机,其中有没有其他的内存,除了栈。 应用的算法和方法RPN到中央栈 - 这使得机器的唯一的事。 所有操作均视为避雷器运营商,它适用于高位n值。 例如,队率先返回地址从堆栈的顶部,等等。D.这种机器的结构很简单,但速度还不够快与更常见的体系竞争。 然而,很多人仍然感到遗憾的是这样一个简单而优雅的方法来计算,每一个计划是OPN的表达,发现其延续的事实。

与RPN一个时间计算器很受欢迎,有的人还在给他们的偏好。 此外,他们还开发出了面向堆栈的语言,如第四。 今天,它是很少使用的,但是从他的前用户仍眷恋。

那么,什么是约逆波兰香肠含义的笑话?

如果我们假设香肠的运营商,中缀符号,它应该是轧辊内,在传统的热狗。 该RPN坐落在两半得到计算后准备在其间。 现在到了困难的部分 - 芥末。 她已经在香肠,T。E.已经计算为一元运算符。 据认为,芥菜也应显示为未计算的,因此应该被移到了香肠的权利......但它是可能的,这需要过大叠......

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 zhcn.atomiyme.com. Theme powered by WordPress.