题目链接: https://leetcode.com/problems/basic-calculator-ii/
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.
Some examples:
"3+2*2" = 7 " 3/2 " = 1 " 3+5 / 2 " = 5
Note: Do not use the eval
built-in library function.
思路: 大致的思路就是将其分解成数和运算符, 然后运算完所有的乘除之后再运算加减, 但是在具体实施上还是需要点技巧. 刚开始我是先分解好数和运算符, 然后再使用双端队列, 如果碰到乘除,就运算; 碰到加减, 就符号和数依次存到队列中去. 然后运算完之后再从队首运算加减. 这样稍微有点麻烦, 因为连同运算符一起存储, 那么在运算的时候还需要考虑运算符, 这就是为什么保存运算符的话我要用双端队列的原因, 在运算乘除的时候我需要从队尾取数据, 但是在只剩加减运算的时候我就要从队首依次取数据了.
一种更为简便的方式是不保存运算符, 只以正负号的形式和数一起保存, 这样可以使用栈来操作.
代码如下:
class Solution { public: int calculate(string s) { int i =-1, pos=0, ans=0; stack<int> st; char op; while(++i < s.size()) { if(s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/'&&i!=s.size()-1) continue; if(i == s.size()-1) i++; // uniform format int val = stoi(s.substr(pos, i-pos)), num = val; if(op == '*') { num = st.top() * val; st.pop(); } else if(op == '/') { num = st.top() / val; st.pop(); } else if(op == '+') num = val; else if(op == '-') num = -val; st.push(num); if(i != s.size()) op = s[i]; pos = i+1; } while(!st.empty()) { ans += st.top(); st.pop(); } return ans; } };第二种思路来自: https://leetcode.com/discuss/71755/c-stack-solution