zoukankan      html  css  js  c++  java
  • Leetcode每日一题 227. 基本计算器 II

    昨天的题基础上加了乘法和除法,但去除了括号,其实也很简单,既然知道了怎么利用栈实现基础的"1+1" ,那么乘法或除法只需要将栈中的上一个数a乘上或除以当前这个数b,得到c,然后让a出栈,c入栈就行了,这里可能会被先乘后除再加再减的数学计算规则给误导,如果再加上括号,导致越想越复杂,其实并没有那么难,因为我们维护的是一个保存了每一位数字的栈,遇到乘或除就按上面的方法过一遍,遇到加减直接将上一个数入栈就行,最后把栈内的每一个数加起来,就是我们要的结果。

    227. 基本计算器 II

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

    整数除法仅保留整数部分。

    示例 1:
    
    输入:s = "3+2*2"
    输出:7
    示例 2:
    
    输入:s = " 3/2 "
    输出:1
    示例 3:
    
    输入:s = " 3+5 / 2 "
    输出:5

    代码如下:

    class Solution {
    public:
        inline bool isdigit(char c)
        {
            return c>='0'&&c<='9';
        }
    public:
        string s;
        int i;
        int s_size;
        int dfs()
        {   
            char sign = '+';
            stack<int> num;
            long long sum = 0;
            while(i<s_size)
            {
                char c = s[i++];
                if(isdigit(c))
                    sum = sum * 10 + (c - '0');
                if(c == '(')
                    sum = dfs();
                if((!isdigit(c)&&c!=' ')||i >= s_size)
                {
                    int tmp;
                    switch(sign){
                        case '+':num.push(sum);break;
                        case '-':num.push(-sum);break;
                        case '*':tmp = num.top() * sum;num.pop();num.push(tmp);break;
                        case '/':tmp = num.top() / sum;num.pop();num.push(tmp);break;
                    }
                    sign = c;
                    sum = 0;
                }
                if(c == ')')
                    break;
            }
            
            int res = 0;
            while(!num.empty())
            {
                res += num.top();
                num.pop();
            }
            return res;
        }
    public:
        int calculate(string s) {
            this->s = s;
            this->i = 0;
            this->s_size = s.size();
            return dfs();
        }
    };

    再加上昨天的括号递归处理,这样就能实现一个简单的完整的字符串式子的计算了。

  • 相关阅读:
    IE8下部分方法失效的解决方法
    C#获取本机IP地址(ipv4)
    WPF中控制窗口显示位置的三种方式
    JS判断IP的正则表达式
    WPF ListView 简单的拖拽实现(转)
    C# 中取绝对值的函数
    移动端rem单位适配使用
    vue中遇到的坑!!!!!
    vux安装中遇到的坑
    移动端常用的代码
  • 原文地址:https://www.cnblogs.com/xiangqi/p/14517523.html
Copyright © 2011-2022 走看看