leetcode 227 基本计算器II
一、题目描述

二、解题思路
整体思路
本题目本质上属于表达式求值的问题,我们可以借助栈结构来解决这个问题,为了方便起见,我们无需真的利用栈来解决,可以用数组来模拟栈结构。
具体思路
(1)变量初始化。st数组用于模拟栈结构,i用于遍历字符串,op记录最近的符号,初始化为'+',因为a和+a的值相同;
(2)遍历字符串:
<1>如果s[i]为空格,就跳过空格;
注意:不要将while写成if了,因为if只能跳过一个空格,导致有些示例跑不过
<2>如果s[i]是数字:
1)首先,利用变量tmp把数字提取出来;
2)如果当前的op为'+',表示这个部分的计算结果为tmp本身,于是将tmp压入栈;
3)如果当前的op为'-',表示这个部分的计算结果为tmp的相反数,于是将-tmp压入栈;
4)如果当前的op为'*',就将栈顶元素修改为st.back()*tmp;
5)如果当前的op为'/',就将栈顶元素修改为st.back()/tmp;
<3>如果s[i]为符号,就修改op,并实现i++;
(3)循环结束后,栈中所存的结果实际上是每一部分计算的结果。将它们累加即为最终的结果,返回sum即可;
三、代码实现
class Solution {
public:int calculate(string s) {//用数组模拟栈解题vector<int> st;int i=0,n=s.size();char op='+';while(i<n){//如果为空字符,跳过while(s[i]==' ') i++;//如果为数字if(s[i]>='0' && s[i]<='9'){//把数字提取出来int tmp=0;while(i<n&&s[i]>='0'&&s[i]<='9')tmp=tmp*10+(s[i++]-'0');if(op=='+') st.push_back(tmp);else if(op=='-') st.push_back(-tmp);else if(op=='*') st.back()*=tmp;else if(op=='/') st.back()/=tmp;}//如果为运算符else{op=s[i];i++;}} int sum=0;for(auto x:st) sum+=x;return sum;}
};