legongju.com
我们一直在努力
2025-01-13 17:29 | 星期一

能否用Java的Stack类实现表达式求值

是的,你可以使用Java的Stack类来实现表达式求值。这里是一个简单的例子,展示了如何使用Stack类实现中缀表达式到后缀表达式(逆波兰表示法)的转换以及计算后缀表达式的值:

import java.util.Stack;
import java.util.StringTokenizer;

public class ExpressionEvaluator {
    public static void main(String[] args) {
        String expression = "3 + 4 * 2 / ( 1 - 5 ) ^ 2";
        String postfix = convertToPostfix(expression);
        int result = evaluatePostfix(postfix);
        System.out.println("Result: " + result);
    }

    public static String convertToPostfix(String expression) {
        Stack stack = new Stack<>();
        StringTokenizer tokenizer = new StringTokenizer(expression);

        while (tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();

            if (isOperator(token)) {
                String topOperand = stack.pop();
                String secondOperand = stack.pop();
                String result = performOperation(topOperand, secondOperand, token);
                stack.push(result);
            } else {
                stack.push(token);
            }
        }

        return stack.pop();
    }

    public static int evaluatePostfix(String postfix) {
        Stack stack = new Stack<>();

        for (String token : postfix.split(" ")) {
            int operand = Integer.parseInt(token);
            stack.push(operand);
        }

        return stack.pop();
    }

    public static boolean isOperator(String token) {
        return token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/") || token.equals("^");
    }

    public static String performOperation(String operand1, String operand2, String operator) {
        int num1 = Integer.parseInt(operand1);
        int num2 = Integer.parseInt(operand2);

        switch (operator) {
            case "+":
                return String.valueOf(num1 + num2);
            case "-":
                return String.valueOf(num1 - num2);
            case "*":
                return String.valueOf(num1 * num2);
            case "/":
                return String.valueOf(num1 / num2);
            case "^":
                return String.valueOf(Math.pow(num1, num2));
            default:
                throw new IllegalArgumentException("Invalid operator: " + operator);
        }
    }
}

这个例子中,我们首先将中缀表达式转换为后缀表达式,然后计算后缀表达式的值。注意,这个例子仅支持整数运算,如果你需要支持浮点数运算,可以将Integer.parseInt()替换为Double.parseDouble(),并在计算时进行相应的类型转换。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/82687.html

相关推荐

  • Java syso输出异常如何解决

    Java syso输出异常如何解决

    当在Java中使用System.out.println()输出异常时,通常是因为程序中存在错误或异常。要解决这个问题,请按照以下步骤操作: 确定异常类型:首先,你需要确定抛出的...

  • syso在Java中的使用场景有哪些

    syso在Java中的使用场景有哪些

    System.out.println() 是 Java 语言中一个非常常见且重要的输出方法,通常被称为 “syso”(system out println 的缩写)。以下是 syso 在 Java 开发中的一些主要...

  • Java syso的作用是什么

    Java syso的作用是什么

    System.out.println() 是 Java 语言中一个非常常用的输出方法,它的主要作用是在控制台(Console)上显示文本信息。当你需要在程序运行过程中查看某些变量的值或...

  • 如何在Java中使用syso输出

    如何在Java中使用syso输出

    在Java中,System.out.println()是一个非常常用的方法,用于在控制台上输出信息 首先,确保已经导入了必要的Java库。在这种情况下,我们需要java.lang.System和j...

  • Java Stack类的内存管理机制是什么

    Java Stack类的内存管理机制是什么

    Java Stack类(java.util.Stack)是一个后进先出(LIFO,Last In First Out)的数据结构,通常用于存储和检索一组元素。它的内存管理机制主要依赖于Java的内存管...

  • 在Java中如何自定义Stack类

    在Java中如何自定义Stack类

    在Java中,可以通过继承java.util.Stack类或实现java.util.Deque接口来自定义一个栈(Stack)类。这里我们给出两种方法的示例:
    方法一:继承java.util.Sta...

  • Java Stack类与其他集合类的区别

    Java Stack类与其他集合类的区别

    Java Stack类与其他集合类(如ArrayList,LinkedList等)之间存在一些关键的区别。以下是这些区别的概述: 基本功能:Stack类是实现LIFO(后进先出)的数据结构,...

  • 如何优化Java中Stack类的性能

    如何优化Java中Stack类的性能

    在Java中,Stack类是基于Vector实现的,而Vector是一个较为古老的数据结构,其性能在某些情况下可能不尽如人意。因此,如果你在寻求优化Stack类的性能,以下是一...