算法刷題筆記-stack-四則運算


題目描述:

給定一個含有數字和運算符的字符串,為表達式添加括號,改變其運算優先級以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。

示例 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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM