Стек калькулятор - PullRequest
       7

Стек калькулятор

2 голосов
/ 13 января 2010

Я понимаю, что калькуляторы основаны на стеке. При использовании большинства калькуляторов, если вы наберете 1 + 2 [enter] [enter], вы получите 5. 1 помещается в стек, + - оператор, затем 2 помещается в стек. 1-й [enter] должен вытолкнуть 1 и 2 из стека, добавить их, чтобы получить 3, затем поместить 3 обратно в стек. 2-й [enter] не должен иметь доступа к 2, потому что он фактически нигде не существует.

Как сохранить 2, чтобы 2-й [enter] мог использовать его?

2 помещается обратно в стек до 3 или он сохраняется где-то еще для дальнейшего использования? Если он помещается обратно в стек, можно ли вызвать переполнение стека, повторно выполнив [operator] [number] [enter] [enter]?

Ответы [ 4 ]

4 голосов
/ 13 января 2010

Концептуально, в аппаратных средствах эти значения заносятся в регистры. В простых ALU (арифметических логических единицах (то есть просто процессорах)) один из регистров будет считаться аккумулятором. Обсуждаемые вами значения могут быть помещены в стек для обработки, но как только стек пуст, значение регистра (включая последнюю операцию) может быть кэшировано в этих регистрах. На что, когда приказано выполнить операцию снова, используется аккумулятор, а также последний аргумент.

Например,

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

Так что это может зависеть от используемого оборудования.

4 голосов
/ 13 января 2010

Единственными настоящими калькуляторами на основе стеков являются калькуляторы, у которых в качестве метода ввода используется обратная польская нотация, поскольку эта нотация напрямую работает со стеками.

2 голосов
/ 13 января 2010

Все, что вам нужно сделать, это сохранить последний оператор и операнд и просто применить их, если стек пуст.

0 голосов
/ 13 января 2010

В википедии есть отличное описание и руководство по алгоритму Shunting-ярд (инфикс -> преобразование RPN).

...