欢迎访问宙启技术站
智能推送

使用Java编写的最简单的逆波兰表达式计算函数

发布时间:2023-06-26 05:01:21

逆波兰表达式是一种基于后缀表达式的数学表达式表示方法,它能够利用栈的特性快速计算出表达式的值。在逆波兰表达式中,操作符位于操作数之后,因此可以直接根据顺序依次进行计算,并且不需要使用括号来确定运算的优先级。

Java 是一种非常流行的编程语言,因为它具有可移植性和安全性,让我们用 Java 实现一个简单的逆波兰表达式计算函数:

首先,我们需要定义一个操作符栈 Stack,用来存储操作符和操作数:

Stack<Double> stack = new Stack();

接着,我们可以输入一个字符串,将其分为操作数和操作符:

String[] tokens = input.split(" ");

遍历分离的 tokens 数组,如果当前的 token 是一个数字,将其放入操作符栈中:

for (String token : tokens) {

    if (token.matches("-?\\d+(\\.\\d+)?")) {

        stack.push(Double.parseDouble(token));

    }

    //如果当前的 token 是一个操作符,则从栈中弹出两个操作数并进行计算

    else if (token.equals("+")) {

        double operand2 = stack.pop();

        double operand1 = stack.pop();

        stack.push(operand1 + operand2);

    } else if (token.equals("-")) {

        double operand2 = stack.pop();

        double operand1 = stack.pop();

        stack.push(operand1 - operand2);

    } else if (token.equals("*")) {

        double operand2 = stack.pop();

        double operand1 = stack.pop();

        stack.push(operand1 * operand2);

    } else if (token.equals("/")) {

        double operand2 = stack.pop();

        double operand1 = stack.pop();

        stack.push(operand1 / operand2);

    } else {

        throw new IllegalArgumentException("Invalid input");

    }

}

最后,我们从栈中弹出最后一个元素,这就是计算出的结果:

return stack.pop();

下面是完整的逆波兰表达式计算函数:

public static double evalRPN(String input) {

    Stack<Double> stack = new Stack();

    String[] tokens = input.split(" ");

    for (String token : tokens) {

        if (token.matches("-?\\d+(\\.\\d+)?")) {

            stack.push(Double.parseDouble(token));

        } else if (token.equals("+")) {

            double operand2 = stack.pop();

            double operand1 = stack.pop();

            stack.push(operand1 + operand2);

        } else if (token.equals("-")) {

            double operand2 = stack.pop();

            double operand1 = stack.pop();

            stack.push(operand1 - operand2);

        } else if (token.equals("*")) {

            double operand2 = stack.pop();

            double operand1 = stack.pop();

            stack.push(operand1 * operand2);

        } else if (token.equals("/")) {

            double operand2 = stack.pop();

            double operand1 = stack.pop();

            stack.push(operand1 / operand2);

        } else {

            throw new IllegalArgumentException("Invalid input");

        }

    }

    return stack.pop();

}

这个函数的时间复杂度为 O(n),其中 n 表示输入字符串的长度。它非常简单并且易于理解,并且可以用来计算基本的算数运算和表达式计算。如果需要更高级的计算和表达式处理,我们可能需要使用更复杂的算法和数据结构。