224. 基本计算器

  1. class Solution {
  2. public int calculate(String s) {
  3. // 预处理
  4. s = s.replace(" ", "");
  5. s = s.replace("(-", "(0-");
  6. Deque<Integer> num = new LinkedList<>();
  7. num.push(0);
  8. Deque<Character> ch = new LinkedList<>();
  9. int index = 0;
  10. while (index < s.length()) {
  11. char cur = s.charAt(index);
  12. if (cur == '(') {
  13. ch.push(cur);
  14. } else if (cur == ')') {
  15. // 计算直到遇到左边的'('
  16. while (ch.peek() != '(') {
  17. cal(num, ch);
  18. }
  19. // 弹出左边的'('
  20. ch.pop();
  21. } else if (cur == '+' || cur == '-') {
  22. if (ch.isEmpty() ||ch.peek() == '(') {
  23. ch.push(cur);
  24. } else {
  25. cal(num, ch);
  26. ch.push(cur);
  27. }
  28. } else {
  29. int curNum = 0;
  30. while (index < s.length() && Character.isDigit(s.charAt(index))) {
  31. curNum = 10 * curNum + (s.charAt(index) - '0');
  32. ++index;
  33. }
  34. num.push(curNum);
  35. continue;
  36. }
  37. ++index;
  38. }
  39. while (!ch.isEmpty()) {
  40. cal(num, ch);
  41. }
  42. return num.peek();
  43. }
  44. private void cal(Deque<Integer> num, Deque<Character> ch) {
  45. int num1 = num.pop();
  46. int num2 = num.pop();
  47. if (ch.peek() == '+') {
  48. num.push(num1 + num2);
  49. } else {
  50. num.push(num2 - num1);
  51. }
  52. ch.pop();
  53. }
  54. }