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

  • 相关阅读:
    驱动下的异常处理
    头文件 .h 与源文件 .ccp 的区别
    驱动程序进阶篇
    驱动中链表的使用
    内存操作相关内核 API 的使用
    链表的概念、建立、删除与插入
    编写简单的 NT 式驱动程序的加载与卸载工具
    驱动程序入门篇
    c++ 指针的简单用法
    CTL_CODE 宏 详解
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4640966.html
Copyright © 2011-2022 走看看