【LeetCode-棧/數學】基本計算器 II
阿新 • • 發佈:2020-07-15
題目描述
實現一個基本的計算器來計算一個簡單的字串表示式的值。
字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格 。 整數除法僅保留整數部分。
示例:
輸入: "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)