中缀表达式求和(只包含+-)

题目描述:中缀表达式求值

描述:
给定一个只包含 非负整数加号 (+)减号 (-)、以及括号 () 的中缀表达式,请编写一个程序计算并返回该表达式的结果。该表达式中可能会包含多位数字和空格,但不包含其他运算符(如乘法、除法等)。

输入:
一个有效的中缀表达式,字符串形式。表达式中的数字为非负整数,并用空格隔开(空格可有可无)。支持嵌套括号,且保证括号配对合法。

输出:
计算表达式的结果,并返回该结果的整数值。

import java.util.Stack;

public class Main {

    // 计算中缀表达式的结果
    public static int calculate(String expression) {
        // 用于存储数字的栈
        Stack<Integer> numberStack = new Stack<>();
        // 用于存储操作符的栈
        Stack<Character> operatorStack = new Stack<>();

        int index = 0;
        while (index < expression.length()) {
            char c = expression.charAt(index);

            // 如果是数字
            if (Character.isDigit(c)) {
                int num = 0;
                // 处理多位数
                while (index < expression.length() && Character.isDigit(expression.charAt(index))) {
                    num = num * 10 + (expression.charAt(index) - '0');
                    index++;
                }
                // 将数字压入数字栈
                numberStack.push(num);
            } else if (c == '(') {
                // 如果是左括号,将其压入操作符栈
                operatorStack.push(c);
                index++;
            } else if (c == ')') {
                // 如果是右括号,进行计算直到找到对应的左括号
                while (!operatorStack.isEmpty() && operatorStack.peek()!= '(') {
                    int num2 = numberStack.pop();
                    int num1 = numberStack.pop();
                    char op = operatorStack.pop();
                    // 进行计算并将结果压入数字栈
                    numberStack.push(performOperation(num1, num2, op));
                }
                // 弹出左括号
                operatorStack.pop();
                index++;
            } else if (c == '+' || c == '-') {
                // 如果是操作符,将其压入操作符栈
                operatorStack.push(c);
                index++;
            } else {
                // 其他情况,继续下一个字符
                index++;
            }
        }

        // 处理剩余的操作符和数字
        while (!operatorStack.isEmpty()) {
            int num2 = numberStack.pop();
            int num1 = numberStack.pop();
            char op = operatorStack.pop();
            numberStack.push(performOperation(num1, num2, op));
        }

        // 返回最终结果
        return numberStack.pop();
    }

    // 根据操作符进行计算
    private static int performOperation(int num1, int num2, char op) {
        switch (op) {
            case '+':
                return num1 + num2;
            case '-':
                return num1 - num2;
            default:
                return 0;
        }
    }

    public static void main(String[] args) {
        String expression = "1+(2-3)+4";
        int result = calculate(expression);
        System.out.println("计算结果为:" + result);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值