LeetCode第227題:基本計算器II(中等)

題目

難度:中等
實現一個基本的計算器來計算一個簡單的字符串表達式的值。
字符串表達式僅包含非負整數,+, - ,*,/ 四種運算符和空格 。 整數除法僅保留整數部分。

示例 1:

輸入: “3+2*2”
輸出: 7

示例 2:

輸入: " 3/2 "
輸出: 1

示例 3:

輸入: " 3+5 / 2 "
輸出: 5

說明:

  • 你可以假設所給定的表達式都是有效的。
  • 請不要使用內置的庫函數 eval。

解題思路

首先理清楚思路,對字符串進行遍歷,通過兩個雙向隊列分別存儲數值和運算符,最關鍵的一步是對*和/遍歷到時直接對數值進行計算,而+和-是遍歷完成後,做從前向後的依次運算即可。
步驟:

  1. 創建兩個雙向隊列分別存儲遍歷到的數值和運算符
  2. 遇到空格跳過
  3. 遇到數值,首先要判斷該數值是幾位數並取到它最終位數的數值,然後判斷dq2隊列中的最後一個符號是否爲*或/,如果是則對dq1中的最後一個數值和當前遍歷到的數值進行運算後,推入隊列dq1中。同時移除隊列dq2中的運算符
  4. 遍歷結束後對dq2的運算符進行遍歷得出最後結果

代碼

class Solution {
public:
    int calculate(string s) {
        deque<int> dq1;
        deque<char> dq2;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' ') continue;
            if(isdigit(s[i])){
                int m = s[i] - '0';
                while(i < s.size() && isdigit(s[++i])){
                    m = m * 10 + (s[i] - '0');
                }
                i--;
                if(dq2.size() && (dq2.back() == '*' || dq2.back() == '/')){
                    int k = dq1.back();
                    dq1.pop_back();
                    dq2.back() == '*' ? dq1.push_back(k * m) : dq1.push_back(k / m);
                    dq2.pop_back();
                }else{
                    dq1.push_back(m);
                }
            }else dq2.push_back(s[i]);
        }
        while(dq2.size()){
            int a = dq1.front(); dq1.pop_front();
            int b = dq1.front(); dq1.pop_front();
            dq2.front() == '+' ? dq1.push_front(a + b) : dq1.push_front(a - b);
            dq2.pop_front();
        }
        return dq1.front();
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章