Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open
(
and closing parentheses
)
, the plus
+
or minus sign
-
, non-negative integers and empty spaces .
Example 1:
Input: "1 + 1"
Output: 2
Example 2:
Input: " 2-1 + 2 "
Output: 3
Example 3:
Input: "(1+(4+5+2)-3)+(6+8)"
Output: 23
Note:
- You may assume that the given expression is always valid.
- Do not use the
built-in library function.eval
題目:實作一個隻有加減法的電腦,輸入中包含小括号、正整數、空格,傳回計算的結果
思路:考察棧的題目,int棧一個存放計算數和括号,char棧存放計算符号,空格不操作。具體來說,周遊s,如若s[i]是左括号則進棧,我定義MAX代替;如果是整數且棧為空或者棧頂元素為MAX,此時數字進棧,注意掃描s時,當出現數字時,需繼續向後掃描以提取多位的整數;如果是整數而棧頂元素也是整數,則取出符号棧頂元素并進行計算,将計算結果重新入棧;如果是右括号,将數字棧連續出棧兩次,并将括号裡面的數字入棧并檢驗棧頂是否需要再次計算。最後傳回數字棧頂即可。
代碼:
#define MAX 10000000
class Solution {
public:
int calculate(string s) {
stack<char> sign;
stack<int> number;
int size = s.size();
for(int i=0;i<size;i++){
if(s[i]=='(')
number.push(MAX); //左括号入數字棧,用MAX替代
else if(s[i]>='0'&&s[i]<='9'){ //出現數字,相後掃描獲得完整數
int s_val=0;
int j;
for(j=i;s[j]>='0'&&s[j]<='9';j++){
s_val = s_val*10+s[j]-'0';
}
i=j-1; //相後多位後,更新i的值
if(number.empty()||number.top()==MAX)
number.push(s_val); //獲得的整數入棧
else{ //取出符号棧頂和數字棧頂進行計算
char op = sign.top();
sign.pop();
int val=0;
if(op=='+')
val = number.top() + (s_val);
if(op=='-')
val = number.top() - (s_val);
number.pop();
number.push(val); //計算結果入棧
}
}
else if(s[i]==')'){ //相當于去除一對括号
int temp = number.top();
number.pop();
number.pop();
if(!sign.empty()){ //通過符号棧是否為空來判斷去除括号後是否需要繼續進行計算
char op = sign.top();
sign.pop();
int val=0;
if(op=='+')
val = number.top() + temp;
if(op=='-')
val = number.top() - temp;
number.pop();
number.push(val);
}
else
number.push(temp); //不需要計算時
}
else if(s[i]=='+'||s[i]=='-') //計算符号入棧
sign.push(s[i]);
else //空格不做處理
;
}
return number.top(); //最後隻剩數字棧頂,傳回即可
}
};
AC,beats 99.6%