題目描述:
給定一個含有數字和運算符的字符串,為表達式添加括號,改變其運算優先級以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。
示例 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 Stack<Integer> stack = 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(); //清洗輸入數據,並記得將洗過的數據回送給s 33 java.util.Stack<Integer> 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<s.length();i++){ 39 if (Character.isDigit(s.charAt(i))){ 40 left_number=left_number*10+s.charAt(i)-'0'; 41 42 }if(i==s.length()-1 || ! Character.isDigit(s.charAt(i))){ 43 fuhao=s.charAt(i); 44 switch (fuhao_before){ 45 case '+': 46 stack.push(left_number); 47 fuhao_before=fuhao; 48 break; 49 case '-': 50 stack.push(-left_number); 51 fuhao_before=fuhao; 52 break; 53 case '*': 54 stack.push(stack.pop()*left_number); //其實是右邊的數 55 fuhao_before=fuhao; 56 break; 57 case '/': 58 stack.push(stack.pop()/left_number); 59 fuhao_before=fuhao; 60 break; 61 default: 62 break; 63 64 } 65 left_number=0; //歸零 66 } 67 } 68 69 int result=0; 70 while (! stack.empty()){ 71 result+=stack.pop(); 72 73 } 74 return result; 75 } 76 }