2010-01-13 118 views
2

我对计算器的理解是它们是基于堆栈的。当你使用大多数计算器时,如果你输入1 + 2 [enter] [enter],你会得到51被压入堆栈,+是运算符,则2被压入堆栈。第一个[enter]应该弹出12离开堆栈,将它们添加到3然后再将3推回堆栈。第二个[enter]不应该有权访问2,因为它在任何地方都不存在。计算器堆栈

2如何保留,以便第二个[enter]可以使用它?

2推回到堆栈之前3还是保留在其他地方供以后使用?如果将它推回堆栈,可以想象通过重复执行[operator] [number] [enter] [enter]会导致堆栈溢出?

+0

只是一个观察,问题包含术语'堆栈溢出'...有趣的:) – kpax 2010-01-13 05:21:35

+1

@kpax:有趣但不完全是巧合。尽管有误导性的标识,但这种编程现象是该网站的名称。 – Dinah 2010-01-13 14:27:16

回答

4

概念上,在硬件中,这些值被放入寄存器。在简单的ALU(算术逻辑单元(即简单的CPU))中,其中一个寄存器将被视为累加器。您正在讨论的值可以放在堆栈上进行处理,但是一旦堆栈为空,寄存器值(包括最后一个操作)可能会缓存在这些寄存器中。当被告知再次执行操作时,使用累加器以及最后一个参数。

例如,

    Reg1  Reg2 (Accumulator) Operator 
Input 1       1 
Input +       1     + 
Input 2    2   1     + 
Enter     2   3     + 
Enter     2   5     + 
Enter     2   7     + 

因此,它可以是所使用的硬件的功能。

2

您只需保留最后一个运算符和操作数,并在堆栈为空时应用它们。

+0

从技术上讲,堆栈将不会为空。它将包含最终计算的数字。 – Dinah 2010-01-13 05:03:59

+0

够公平的。如果堆栈不包含可用的操作员,那么。 – 2010-01-13 05:05:26

4

唯一真正的基于堆栈的计算器是具有反向波兰标记作为输入方法的计算器,因为该标记直接在堆栈上运行。

+1

中缀表达式可以很容易地转换为后缀表达式,然后可以使用堆栈。 – 2010-01-13 05:10:37

+2

没错。值得强调的是,普通的手动计算器根本不是基于堆栈的。正如马特指出的,他们可能只有两个寄存器。他们不会执行运算符优先级或括号(需要堆栈的功能)。 – 2010-01-13 16:43:35