用 Java 创建 SRPN 计算器

问题描述 投票:0回答:2

在一次工作面试中,我的任务是从头开始创建一个 SRPN(饱和逆波兰表示法)计算器。他们让我深入了解了他们自己创建的一个(没有显示他们的编码),并要求我准确地复制它。

该代码将要求用户在终端中写入他们的号码和运营商,以便获得特定格式的答案。 例如

'3
3
*
='

会打印 9。

他们还使用了其他运算符,例如 +、-、*.^、% 来计算不同的答案。 计算甚至更进一步,使用如下方程:

'3
3
*
4
4
*
+
='

换句话说,翻译为“(3x3)+(4x4)”。

他们还使用了字母 f,当你输入这个字母时,它会将之前的数字带回等式中。几乎就像记忆一样。

好吧,可以肯定地说,我更像是 Python 专家,而不是 Java 专家,因为我不知道该怎么做。仅根据 Java 的少量经验,我了解到最初创建了一个堆栈,然后他们初始化了所有运算符(+、-、%、*、^),为它们提供了正确的函数以创建答案。不知道他们是如何实现 f 函数的。但我知道他们很可能使用缓冲读取器来收集用户输入,以便构建方程;并依次创建答案。

问题是我不知道该怎么做,但我很想学习。网上的所有答案都是多种多样且广泛的/ChatGPT 也没有帮助。

是否有任何 Java 专家愿意分享这样的代码的外观?

谢谢大家

java stack
2个回答
0
投票

我认为您需要根据输入构建波兰树,并且基于输入的一般规则是运算符遵循其操作数。通常有二元运算符,例如 + 和 *,您可以放心地依赖它。

f 正在存储一些东西:

他们还使用了字母 f,当你输入这个字母时,它会将之前的数字带回等式中。几乎就像记忆一样。

如果我从字面上理解这一点 - 并且考虑到上下文我没有其他选择 - 那么 f 基本上指示系统将所有数字粘贴到其上方。因此,您需要将先前的数字存储在类似队列的结构(先进先出)中,也就是说,不完全是队列,因为您不想删除这些值,但尽管如此,您仍希望在您收到的订单。

我不确定您需要什么运算符,但是如果您想要与以前相同的运算符,那么您也可以将运算符存储在队列中。每当 f 触发它时,可以将这种类似队列的结构视为临时输入源。


0
投票

这是java中最小的RPN计算器,它不处理错误和边缘情况,但它应该让你知道如何开始实现这些东西:

import java.util.Scanner;
import java.util.Stack;

class Main {
    public static void main(String[] argv) {
        var scanner = new Scanner(System.in);

        var stack = new Stack<Double>();
        var answerStack = new Stack<Double>();
        while (true) {
            var input = scanner.nextLine();
            switch (input) {
                case "+": stack.push(stack.pop() + stack.pop()); break;
                case "-": stack.push(stack.pop() - stack.pop()); break;
                case "*": stack.push(stack.pop() * stack.pop()); break;
                case "^": var p = stack.pop(); stack.push(Math.pow(stack.pop(), p)); break;
                case "%": var d = stack.pop(); stack.push(stack.pop() / d); break;
                case "=": var r = stack.pop(); answerStack.push(r); System.out.println(r); break;
                case "f": stack.push(answerStack.pop()); break;
                default: stack.push(Double.valueOf(input)); break;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.