1. 程式人生 > >Q227 Basic Calculator II

Q227 Basic Calculator II

循環 asi 但是 不同 空格 asc sdi 這一 body

/*
        看的答案,設置一個符號變量記錄這個數前邊的符號是什麽,不同的符號進行不同的操作。這點自己想到了。
        沒想到的是由於乘除相當於一個優先級高的線程,所以要先處理,還有存取前一個乘數或者分子,應該怎麽辦。
        答案用的是stack,利用先進後出的特點,當是乘除法時pop出前一個數,處理完乘除後再存取。
        所以,以後遇到經常遇到前一個數值且不能在此次循環中及時處理時,可以用stack存取。
        這裏不能及時處理比如此題中處理完一連串乘除後才能加到最後結果上。雖然可以用list,但是應該比較麻煩
         */
        //
第一個數前邊的符號默認是+ char sign = ‘+‘; int res = 0; //定義stack Stack<Integer> stack = new Stack<>(); int l = s.length(); //可能有多位數,作為臨時變量 int num = 0; for (int i = 0;i < l;i++) { char c = s.charAt(i); //這位是數的情況,如果連續式數,那麽要把所有數組合為一個數
if (Character.isDigit(c)) { //提取數字char真值的方法(不是char的ascii碼):c - ‘0‘; num = num*10 + c-‘0‘; } //這一位是符號的情況,註意如果是最後一位那麽也要處理,因為邏輯是遇到符號才計算前邊的數,但是後一位後邊沒有符號 if (!Character.isDigit(c) && c != ‘ ‘ || i == l-1) {
//根據這個數前邊的符號進行不同操作 if (sign == ‘+‘) stack.push(num); if (sign == ‘-‘) stack.push(-num); if (sign == ‘*‘) stack.push(stack.pop()*num); if (sign == ‘/‘) stack.push(stack.pop()/num); num = 0; //記錄下這個符號,作為下一個數前邊的符號 sign = c; } //空格跳過,不做任何操作 } for (int n:stack) res += n; return res;

Q227 Basic Calculator II