LeetCode 227. 基本計算器 II 棧 雙指標
阿新 • • 發佈:2020-12-24
地址https://leetcode-cn.com/problems/basic-calculator-ii/
實現一個基本的計算器來計算一個簡單的字串表示式的值。 字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格。 整數除法僅保留整數部分。 示例1: 輸入: "3+2*2" 輸出: 7 示例 2: 輸入: " 3/2 " 輸出: 1 示例 3: 輸入: " 3+5 / 2 " 輸出: 5 說明: 你可以假設所給定的表示式都是有效的。 請不要使用內建的庫函式 eval。
演算法1
有了加減乘除多種符號後 就要考慮符號優先順序
解決辦法是遇到+- 符號 數字入棧
遇到*/則再入棧下一個數字後進行計算 然後計算結果入棧
最後整個符號棧應該就只剩同級別的+-符號了
這時候應該從前往後計算而不是使用棧的倒序計算
所以本題我資料結構選用了deque 而不是stack
C++ 程式碼
class Solution { public: deque<int> deNum; deque<int> deOp; int calc(int a, int b, char op) { if (op == '+') return a + b; if (op == '-') return a - b; if (op == '/') return a / b; if (op == '*') return a * b; return -9999999; }int calculate(string s) { int opFlag = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == '*' || s[i] == '/' ) { opFlag = 1; deOp.push_back(s[i]); } else if (s[i] == '+' || s[i] == '-') { deOp.push_back(s[i]); }else if (s[i] == ' ') { continue; } else { int l = i; while (l < s.size() && s[l] == ' ') l++; int r = l + 1; while (r < s.size() && s[r] >= '0' && s[r] <= '9') r++; string strNum = s.substr(l, r - l); int n = atoi(strNum.c_str()); deNum.push_back(n); i = r - 1; if (opFlag == 1) { opFlag = 0; int a = deNum.back(); deNum.pop_back(); int b = deNum.back(); deNum.pop_back(); char op = deOp.back(); deOp.pop_back(); int c = calc(b, a, op); deNum.push_back(c); } } } while (!deOp.empty()) { //相同級別符號 從前面計算 int a = deNum.front(); deNum.pop_front(); int b = deNum.front(); deNum.pop_front(); char op = deOp.front(); deOp.pop_front(); int c = calc(a, b, op); deNum.push_front(c); } return deNum.front(); } };