zoukankan      html  css  js  c++  java
  • 【LeetCode】227. Basic Calculator II

    Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string.

    The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

    You may assume that the given expression is always valid.

    Some examples:

    "3+2*2" = 7
    " 3/2 " = 1
    " 3+5 / 2 " = 5
    

    Note: Do not use the eval built-in library function.

    Credits:
    Special thanks to @ts for adding this problem and creating all test cases.

    Basic Calculator对照,

    乘除法优先级高,因此一旦出现就立即计算,

    到最后栈中剩下的就是顺序执行的加减计算。

    先将栈逆序,再出栈计算。注意,此时的操作数先后顺序反过来。

    class Solution {
    public:
        int calculate(string s) {
            stack<int> num;
            stack<char> op;
            int i = 0;
            while(i < s.size())
            {
                while(i < s.size() && s[i] == ' ')
                    i ++;
                if(i == s.size())
                    break;
                if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
                {
                    op.push(s[i]);
                    i ++;
                }
                else
                {
                    int n = 0;
                    while(i < s.size() && s[i] >= '0' && s[i] <= '9')
                    {
                        n = n * 10 + (s[i]-'0');
                        i ++;
                    }
                    num.push(n);
                    if(!op.empty() && (op.top() == '*' || op.top() == '/'))
                    {
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        if(op.top() == '*')
                            num.push(n1 * n2);
                        else
                            num.push(n1 / n2);
                        op.pop();
                    }
                }
            }
            // '+'/'-' in order
            if(!op.empty())
            {
                // reverse num and op
                stack<int> num2;
                while(!num.empty())
                {
                    num2.push(num.top());
                    num.pop();
                }
                num = num2;
                stack<char> op2;
                while(!op.empty())
                {
                    op2.push(op.top());
                    op.pop();
                }
                op = op2;
                
                while(!op.empty())
                {
                    // pay attention to the operands order!
                    int n1 = num.top();
                    num.pop();
                    int n2 = num.top();
                    num.pop();
                    if(op.top() == '+')
                        num.push(n1 + n2);
                    else
                        num.push(n1 - n2);
                    op.pop();
                }
            }
            return num.top();
        }
    };

  • 相关阅读:
    细节决定成败,为什么他能挣15亿
    GLSL Notes
    Connecting Physics Bodies
    Pylint
    Physicals
    Advanced Scene Processing
    Working with Other Node Types II
    OperateParticleWithCodes
    SpriteParticle II
    Working with Other Node Types
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4640966.html
Copyright © 2011-2022 走看看