[每日一题]Leetcode227. 基本计算器 II

今天的每日一题是Leetcode227. 基本计算器 II,题意如下:

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
1 <= s.length <= 3 * 105
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数

这道题是昨天的进阶版,但是这道题少了括号,多了乘法和除法。思路也很简单,用一个栈存储加法和减法的数(加法存正值,减法存负值),遇到乘除法先把乘除法和栈顶的元素计算之后再入栈,这样就把乘除法全部先算完了,栈中只存在加减法,再遍历一遍栈把所有数加起来就是最后的答案了。写代码时注意判断中的细节应该就问题不大。
c++参考代码:

class Solution {
     
public:
    int calculate(string s) {
     
       stack<int> st;
       int n=s.size();
       char sign='+';
       int now=0;
       st.push(0);
       for(int i=0;i<n;i++)
       {
     
           if(s[i]>='0'&&s[i]<='9')
           {
     
               now=now*10+(s[i]-'0');
           }
           if(!(s[i]>='0'&&s[i]<='9')&&s[i]!=' '||i==n-1)
            {
     
                if(sign=='+')
                st.push(now);
               else if(sign=='-')
                st.push(-1*now);
               else if(sign=='*')
               {
     
                   int num=st.top()*now;
                   st.pop();
                   st.push(num);
               }
               else if(sign=='/')
                {
     
                   int num=st.top()/now;
                   st.pop();
                   st.push(num);
                }
                sign=s[i];
                now=0;
            }
       }
       int ans=0;
       while(!st.empty())
       {
     
         ans+=st.top();
         st.pop();
       }
       return ans;
    }
};

时间复杂度:O(N).
[每日一题]Leetcode227. 基本计算器 II_第1张图片
参考资料
·力扣官方题解

你可能感兴趣的:(每日一题,c++,leetcode,栈,字符串)