问题思路

用栈来作为临时存取非括号的求和数。对字符串进行逐个遍历,然后对遇到的每个字符串进行判断

  • 数字:将其求和到sum当中
  • (:将上述sum和符号压入栈内
  • ):将栈内的元素取出与现有sum求和
  • +:直接走
  • -:直接走不过给下一个计算数提前加负号

    代码实现

    ```java package com.wztlink1013.problems.leetcode.editor.cn;

// P224.基本计算器 //实现一个基本的计算器来计算一个简单的字符串表达式的值。 // // 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。 // // 示例 1: // // 输入: “1 + 1” //输出: 2 // // // 示例 2: // // 输入: “ 2-1 + 2 “ //输出: 3 // // 示例 3: // // 输入: “(1+(4+5+2)-3)+(6+8)” //输出: 23 // // 说明: // // // 你可以假设所给定的表达式都是有效的。 // 请不要使用内置的库函数 eval。 // // Related Topics 栈 数学 // 👍 309 👎 0

import java.util.Stack;

public class P224BasicCalculator{ public static void main(String[] args) { Solution solution = new P224BasicCalculator().new Solution(); int key_1 = solution.calculate(“7896979”); int key_2 = solution.calculate(“(23-2)-33+1111”); System.out.println(key_1); System.out.println(key_2); }

//leetcode submit region begin(Prohibit modification and deletion) class Solution { public int calculate(String s) { Stack stack_1 = new Stack(); int sum = 0; int sign = 1; int num = 0;

  1. for (int i=0;i<s.length();i++) {
  2. char ch = s.charAt(i);
  3. if (Character.isDigit(ch)) {
  4. num = 10 * num + (int) (ch - '0');
  5. } else if (ch == '+') {
  6. num = num * sign;
  7. sum = sum + num;
  8. sign = 1;
  9. num = 0;
  10. } else if (ch == '-') {
  11. num = num * sign;
  12. sum = sum + num;
  13. sign = -1;
  14. num = 0;
  15. } else if (ch == '(') {
  16. stack_1.push(sum);
  17. stack_1.push(sign);
  18. sum = 0;
  19. num = 0;
  20. sign = 1;
  21. } else if (ch == ')') {
  22. num = num * sign;
  23. sum = sum + num;
  24. sum = stack_1.pop() * sum;
  25. sum = sum + stack_1.pop();
  26. num = 0;
  27. sign = 1;
  28. }
  29. }
  30. sum = sum + sign * num;
  31. return sum;
  32. }}

//leetcode submit region end(Prohibit modification and deletion)

} ```