問題
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
例子
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5
分析
1 使用istringstream,將字符串變成字符流,自動(dòng)分割字符串并直接轉(zhuǎn)換成數(shù)字或字符
2 使用棧,保存表達(dá)式中的數(shù)字或者兩個(gè)數(shù)字*/的結(jié)果
3 遍歷棧,將棧元素依次相加即可得到表達(dá)式的計(jì)算結(jié)果
舉個(gè)例子,對(duì)于表達(dá)式3-5/2,首先初始化運(yùn)算符為+號(hào),即表達(dá)式變成+3-5/2;將+3壓入棧,-5壓入棧,發(fā)現(xiàn)下一個(gè)運(yùn)算符是/,將-5出棧,將-5/2=-2入棧。
要點(diǎn)
- istringstream可以處理任意多空格分割的字符串
- 用棧來保存上一步的數(shù)字
- 用vector模擬棧
時(shí)間復(fù)雜度
O(n)
空間復(fù)雜度
O(n)
代碼
class Solution {
public:
int calculate(string s) {
vector<int> stk;
istringstream iss(s);
char op = '+';
int res = 0, term;
while (iss >> term) {
if (op == '+' || op == '-') {
stk.push_back(op == '+' ? term : -term);
}
else {
int last = stk.back();
stk.pop_back();
stk.push_back(op == '*' ? last * term : last / term);
}
iss >> op;
}
for (int num : stk)
res += num;
return res;
}
};