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


 
原文地址:https://www.cnblogs.com/awy-blog/p/3565566.html