題目
難度:中等
實現一個基本的計算器來計算一個簡單的字符串表達式的值。
字符串表達式僅包含非負整數,+, - ,*,/ 四種運算符和空格 。 整數除法僅保留整數部分。
示例 1:
輸入: “3+2*2”
輸出: 7
示例 2:
輸入: " 3/2 "
輸出: 1
示例 3:
輸入: " 3+5 / 2 "
輸出: 5
說明:
- 你可以假設所給定的表達式都是有效的。
- 請不要使用內置的庫函數 eval。
解題思路
首先理清楚思路,對字符串進行遍歷,通過兩個雙向隊列分別存儲數值和運算符,最關鍵的一步是對*和/遍歷到時直接對數值進行計算,而+和-是遍歷完成後,做從前向後的依次運算即可。
步驟:
- 創建兩個雙向隊列分別存儲遍歷到的數值和運算符
- 遇到空格跳過
- 遇到數值,首先要判斷該數值是幾位數並取到它最終位數的數值,然後判斷dq2隊列中的最後一個符號是否爲*或/,如果是則對dq1中的最後一個數值和當前遍歷到的數值進行運算後,推入隊列dq1中。同時移除隊列dq2中的運算符
- 遍歷結束後對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();
}
};