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 };

 

posted @ 2021-03-11 11:06  Mrsdwang  阅读(57)  评论(0)    收藏  举报