227. Basic Calculator II
仅供自己学习
思路:
因为存在乘除优先级高的运算,所以可以说是存在计算有滞后性,那么可以用栈来存储前面的要进行加减法的数,对于乘除法,我们将他与栈顶元素相乘或相除再放入栈中,这样就能全进行加法。我们用一个变量op来存放运算符,用一个num来存 运算符之前的数字。
整体的顺序是,如果遍历到的元素是数字,那么就用 num=num*10 +int(s[i]-‘0’),这里乘10是因为如果是连续出现数字,那么就是进位的功能。S[i]-‘0’就是通过ANSI码转化为数字了。然后会再判断当前的元素是否为字符并且不是空格,或者i=n-1,如果不是则遍历到下一个元素,如果是则将根据op进行处理,如果是‘+’则将num放入栈,如果是‘-’则将num相反数放如栈,如果是‘*’则用栈顶元素乘以num,除也一样。每次op也是用了之前的运算符才会更新,且num的数也是村的 op存放的运算符后面的一个数,所以i==n-1也能进入对栈操作的过程是因为,最后一个元素是数字,仍然要对该数字和前面的运算符进行计算,如果没有这条件就会丢失对最后一个元素的操作。
代码:
1 class Solution { 2 public: 3 int calculate(string s) { 4 int size=s.length(); 5 vector<int> st; //vector可以有栈的功能 6 int num=0; 7 char op='+'; 8 for(int i=0;i<size;++i){ 9 if(isdigit(s[i])){ 10 num=num*10+int(s[i]-'0'); 11 } 12 if(!isdigit(s[i])&&s[i]!=' '||i==size-1){ 13 switch(op){ 14 case '+': st.push_back(num); break; 15 case '-': st.push_back(-num); break; 16 case '*': st.back()*=num; break; 17 default :st.back()/=num; break; 18 } 19 op=s[i]; 20 num=0; 21 } 22 23 } 24 return accumulate(st.begin(),st.end(),0); 25 } 26 };

浙公网安备 33010602011771号