计算器III

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。 

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 ('+', '-', '*', '/', '(', ')') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数
/**
 * 给你一个数学表达式,含有+、-、*、/、()
 * 参与运算的都是非负整数
 * "1 + 1" = 2
 * " 6-4 / 2 " = 4
 * "2*(5+5*2)/3+(6/2+8)" = 21
 * "(2+6* 3+5- (3*14/7+2)*5)+3"=-12
 */
public class Calculator {

    public static void main(String[] args) {
        System.out.println(calculate("1+1"));
        System.out.println(calculate("6-4 / 2"));
        System.out.println(calculate("2*(5+5*2)/3+(6/2+8)"));
        System.out.println(calculate("(2+6* 3+5- (3*14/7+2)*5)+3"));
    }

    public static int calculate(String s) {
        Queue<Character> queue = new LinkedList<Character>();
        for(char c : s.toCharArray()) {
            queue.add(c);
        }
        return doCalculate(queue);
    }

    private static int doCalculate(Queue<Character> queue) {
        Stack<Integer> stack = new Stack<Integer>();
        char sign = '+';
        int num = 0;
        while (!queue.isEmpty()) {
            //出队
            char c = queue.poll();
            if (Character.isDigit(c)) {
                num = 10 * num + Character.getNumericValue(c);
            }
            // 遇到左括号开始递归计算 num
            if (c == '(') {
                num = doCalculate(s);
            }
            if ((!Character.isDigit(c) && c != ' ') || s.isEmpty()) {
                if (sign == '+') {
                    stack.push(num);
                } else if (sign == '-') {
                    stack.push(-num);
                } else if (sign == '*') {
                    stack.push(stack.pop() * num);
                } else if (sign == '/') {
                    stack.push(stack.pop() / num);
                }
                num = 0;
                sign = c;
            }
            // 遇到右括号返回递归结果
            if (c == ')') {
                break;
            }
        }
        int res = 0;
        for (int i : stack) {
            res += i;
        }
        return res;
    }
}

 

posted on 2024-07-06 19:20  zhengbiyu  阅读(7)  评论(0编辑  收藏  举报