zoukankan      html  css  js  c++  java
  • Evaluate Reverse Polish Notation

    题目描述:

    Evaluate the value of an arithmetic expression in Reverse Polish Notation.

    Valid operators are +-*/. Each operand may be an integer or another expression.

    Some examples:

      ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
      ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

    分析:这一题就是中缀算术表达式求值运算。最经典的方法就是利用栈来解决这个问题。我们使用一个“辅助栈”来保存遍历到的操作数,当遇到操作符的时候,就从栈中pop出两个元素,进行计算,然后将结果push至“辅助栈”中,然后继续遍历。同时注意边界条件的判断,当这个表达式只有一个时输出是什么,当除法的被除数为0时,是怎么样的情况,都需要进行判断,然而这道题编译的时候没有考虑被除数为0的情况,但是面试的时候一定要注意边界条件的判断,这是面试官考察你考虑问题完不完全。
    class Solution {
    public:
        int evalRPN(vector<string> &tokens) {
            if(tokens.size()==1)
            {
                vector<string>::iterator iter=tokens.begin();
                return atoi(iter->c_str());
            }
            stack<int> numbers;
            vector<string>::iterator iter=tokens.begin();
            int num1=0,num2=0;
            for(;iter!=tokens.end();++iter)
            {
                if(*iter=="+"||*iter=="-"||*iter=="/"||*iter=="*")
                {
                    num1=numbers.top();
                    numbers.pop();
                    num2=numbers.top();
                    numbers.pop();
                    if(*iter=="+")
                        numbers.push(num2+num1);
                    else if(*iter=="-")
                        numbers.push(num2-num1);
                    else if(*iter=="*")
                        numbers.push(num2*num1);
                    else if(*iter=="/")
                    {
                        numbers.push(num2/num1);
                    }
                }
                else
                    numbers.push(atoi(iter->c_str()));
            }
            return numbers.top();
        }
    };
     Python语言实现,道理都是一样的:
    class Solution:
        # @param tokens, a list of string
        # @return an integer
        def evalRPN(self, tokens):
            numbers=[]
            for number in tokens:
                if number not in ["+","-","*","/"]:
                    numbers.append(int(number))
                elif number in ["+","-","*","/"]:
                    num1=numbers.pop()
                    num2=numbers.pop()
                    if number=="+":
                        numbers.append(num1+num2)
                    elif number=="-":
                        numbers.append(num2-num1)
                    elif number=="*":
                        numbers.append(num2*num1)
                    elif number=="/":
                        numbers.append(int(num2/float(num1)))
            return int(numbers.pop())
                    
    
    
    
     
  • 相关阅读:
    MySQL的字符编码体系(一)——数据存储编码
    poj 1659 Frogs&#39; Neighborhood 度序列可图化 贪心
    POJ 1083 &amp;&amp; HDU 1050 Moving Tables (贪心)
    cocos2d-x wp8 中文显示问题
    Linux多线程编程
    how tomcat works 五 servlet容器 上
    SecureCRT 选择Courier New等其他字体.
    如何设置secureCRT的鼠标右键为弹出文本操作菜单功能
    SecureCRT中文显示乱码
    ZooKeepr日志清理
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3565566.html
Copyright © 2011-2022 走看看