计算器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; } }