lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 题目

 https://leetcode.cn/problems/basic-calculator/

 

2. 解法

 

解题思路:

  • 使用两个栈,一个存储数字,一个存储运算符
  • 遍历字符串,如果遇到数字,就将其转换为整数并压入数字栈
  • 如果遇到运算符,就比较其与运算符栈顶的优先级,如果高于或等于栈顶的优先级,就压入运算符栈;如果低于栈顶的优先级,就从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,重复这个过程直到运算符栈为空或者栈顶的优先级低于当前运算符
  • 如果遇到左括号,就直接压入运算符栈
  • 如果遇到右括号,就从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,重复这个过程直到遇到左括号,并将左括号弹出
  • 遍历完字符串后,如果运算符栈不为空,就继续从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,直到运算符栈为空
  • 最后从数字栈中弹出最终结果并返回
public class Solution {
    public int calculate(String s) {
        // 去除空格
        s = s.replaceAll(" ", "");
        // 创建两个栈
        Stack<Integer> numStack = new Stack<>(); // 存储数字
        Stack<Character> opStack = new Stack<>(); // 存储运算符
        // 遍历字符串
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) { // 如果是数字
                // 将连续的数字转换为整数
                int num = c - '0';
                while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
                    num = num * 10 + (s.charAt(i + 1) - '0');
                    i++;
                }
                // 将整数压入数字栈
                numStack.push(num);
            } else if (c == '+' || c == '-') { // 如果是加号或减号
                // 比较当前运算符与栈顶运算符的优先级
                while (!opStack.isEmpty() && opStack.peek() != '(') {
                    // 如果栈顶运算符的优先级高于或等于当前运算符,就进行计算
                    int num2 = numStack.pop();
                    int num1 = numStack.pop();
                    char op = opStack.pop();
                    int res = calculate(num1, num2, op);
                    // 将计算结果压入数字栈
                    numStack.push(res);
                }
                // 将当前运算符压入运算符栈
                opStack.push(c);
            } else if (c == '(') { // 如果是左括号
                // 直接压入运算符栈
                opStack.push(c);
            } else if (c == ')') { // 如果是右括号
                // 从栈中弹出数字和运算符进行计算,直到遇到左括号
                while (!opStack.isEmpty() && opStack.peek() != '(') {
                    int num2 = numStack.pop();
                    int num1 = numStack.pop();
                    char op = opStack.pop();
                    int res = calculate(num1, num2, op);
                    numStack.push(res);
                }
                // 将左括号弹出
                opStack.pop();
            }
        }
        // 遍历完字符串后,如果运算符栈不为空,就继续进行计算,直到运算符栈为空
        while (!opStack.isEmpty()) {
            int num2 = numStack.pop();
            int num1 = numStack.pop();
            char op = opStack.pop();
            int res = calculate(num1, num2, op);
            numStack.push(res);
        }
        // 最后从数字栈中弹出最终结果并返回
        return numStack.pop();
    }

    // 定义一个辅助方法,用于计算两个数字和一个运算符的结果
    private int calculate(int num1, int num2, char op) {
        if (op == '+') {
            return num1 + num2;
        } else if (op == '-') {
            return num1 - num2;
        } else {
            return 0; // 不会发生的情况
        }
    }
}

  

 

3. 总结

posted on 2023-04-25 13:54  白露~  阅读(11)  评论(0编辑  收藏  举报