题目描述:
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例 1:
输入: "2-1-1"
输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses解题思路:
1、每次仅运算乘除,将运算结果入栈,
a、保留前一个运算符
b、如果前一个运算符是乘除,弹出一个数字,与当前运算,结果回送。
c、如果是减号,将当前数字取负,送进堆栈;正号,直接入栈
2、扫描结束后,对栈中所有元素求和。结束
java语言实现:
1 class Solution { 2 public static int calculate(String s) { 3 int res = 0; 4 int num = 0; 5 char sign = '+'; 6 Stackstack = new Stack<>(); 7 char[] sarr = s.toCharArray(); 8 for (int i = 0; i < sarr.length; i++) { 9 if (sarr[i] >= '0') {10 num = num * 10 + sarr[i] - '0'; // 注意字符变成数字,方可参加运算,否则直接ASCII码参与运算,出错。11 }12 if ((sarr[i] < '0' && sarr[i] != ' ') || i == sarr.length - 1) {13 if (sign == '+') {14 stack.push(num);15 } else if (sign == '-') {16 stack.push(-num);17 } else if (sign == '*' || sign == '/') {18 int top = stack.pop();19 stack.push(sign == '*' ? top * num : top / num);20 }21 sign = sarr[i];22 num = 0;23 }24 }25 while (!stack.isEmpty()) {26 res += stack.pop();27 }28 return res;29 }30 31 public static int calculate2(String s) {32 s=s.trim(); //清洗输入数据,并记得将洗过的数据回送给s33 java.util.Stack stack = new java.util.Stack<>();34 // String[] nums=s.split("[-+/*]");35 int left_number=0;36 char fuhao_before='+'; //保存前一个符号37 char fuhao;38 for (int i=0;i