1. 程式人生 > 實用技巧 >【LeetCode-棧/數學】基本計算器 II

【LeetCode-棧/數學】基本計算器 II

題目描述

實現一個基本的計算器來計算一個簡單的字串表示式的值。

字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格 。 整數除法僅保留整數部分。
示例:

輸入: "3+2*2"
輸出: 7

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

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

說明:

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

題目連結: https://leetcode-cn.com/problems/basic-calculator-ii/

思路

使用一個棧 nums 儲存計算的中間結果,使用變數 preOpr 記錄前一個運算子,假設當前數字是 cur:

  • 如果 preOpr=='+',則將 cur 入棧;
  • 如果 preOpr=='-',則將 -cur 入棧;
  • 如果 preOpr=='*',因為 * 的優先順序比加減高,所以將 nums 棧頂元素乘以 cur;
  • 如果 preOpr=='/',因為 / 的優先順序比加減高,所以將 nums 棧頂元素除以 cur;

這樣的話,將字串遍歷一遍,棧中就會儲存一些中間結果。我們將棧中的中間結果全部相加就是最終的答案。

程式碼如下:

class Solution {
public:
    int calculate(string s) {
        if(s.empty()) return 0;

        stack<int> nums;
        char preOpr = '+';
        int cur = 0;
        s += "#"; // 表示字串結束,最後一個數字進入else分支
        for(int i=0; i<s.size(); i++){
            if(s[i]==' ') continue;
            if(isdigit(s[i])){
                cur = cur * 10 + (s[i] - '0');
            }else{
                if(preOpr=='+') nums.push(cur);
                else if(preOpr=='-') nums.push(-cur);
                else if(preOpr=='*') nums.top() *= cur;
                else if(preOpr=='/') nums.top() /= cur;
                cur = 0;
                preOpr = s[i];
            }
        }

        int ans = 0;
        while(!nums.empty()){
            ans += nums.top();
            nums.pop();
        }
        return ans;
    }
};
  • 時間複雜度:O(n)
  • 空間複雜度:O(n)

參考

https://leetcode-cn.com/problems/basic-calculator-ii/solution/li-yong-zhan-jiang-si-ze-yun-suan-hua-jian-cheng-j/