Data structures 计算器堆栈

Data structures 计算器堆栈,data-structures,stack,calculator,Data Structures,Stack,Calculator,我对计算器的理解是它们是基于堆栈的。当你使用大多数计算器时,如果你输入1+2[enter][enter]你会得到51被推到堆栈上,+是操作符,然后2被推到堆栈上。第一个[输入]应从堆栈中弹出1和2,将它们添加到3中,然后将3推回到堆栈上。第二个[enter]不应该访问2,因为它实际上不存在于任何地方 如何保留2,以便第二个[输入]可以使用它 是在3之前将2推回到堆栈上,还是保留在其他地方供以后使用?如果它被推回到堆栈上,重复执行[operator][number][enter][enter],是

我对计算器的理解是它们是基于堆栈的。当你使用大多数计算器时,如果你输入
1+2[enter][enter]
你会得到
5
<代码>1被推到堆栈上,
+
是操作符,然后
2
被推到堆栈上。第一个
[输入]
应从堆栈中弹出
1
2
,将它们添加到
3
中,然后将
3
推回到堆栈上。第二个
[enter]
不应该访问
2
,因为它实际上不存在于任何地方

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


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

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

唯一真正基于堆栈的计算器是使用反向波兰符号作为输入方法的计算器,因为该符号直接作用于堆栈

这本书有很好的描述和教程

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

比如说,

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

因此,这可能是所用硬件的功能。

从技术上讲,堆栈不会为空。它将包含最终计算的数字。这很公平。如果堆栈不包含可用的运算符,则.Infix表达式可以轻松转换为后缀表达式,然后可以使用stack.Right。值得强调的是,普通的手工计算器并不是基于堆栈的。正如马特指出的,它们可能只有两个寄存器。它们不做运算符优先级或括号(需要堆栈的功能)。只是观察一下,这个问题包含术语“堆栈溢出”…有趣:)@kpax:有趣,但并不完全巧合。尽管有误导性的标志,但这种编程现象正是该网站的名字。