1. 程式人生 > 實用技巧 >LeetCode 227. 基本計算器 II 棧 雙指標

LeetCode 227. 基本計算器 II 棧 雙指標

地址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(); } };