150. Evaluate Reverse Polish Notation-LeetCode-Python

150. 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.

Note:

Division between two integers should truncate toward zero.
The given RPN expression is always valid.   That means the expression would always evaluate
to a result and there won't be any divide by zero operation.

Example 1:

Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9

Example 2:

Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6

Example 3:

Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation: 
  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

First Accept

使用python2时要注意,对于负数的除法会进行向上取整。比如6/-132 = -1

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        stack = []
        operater = {'+', '-', '*', '/'}
        for c in tokens:
            if c in operater:
                end = stack.pop()
                start = stack.pop()
                stack.append(str(int(eval(start+c+end))))
            else:
                stack.append(c)
        print(stack)
        return int(stack[-1])


s = Solution()
print(s.evalRPN(
 ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]))

Fastest

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        curr = None
        operators = ['+', '-', '*', '/']
        for ele in tokens:
            if len(stack) >= 2:
                if ele in operators:
                    b, a = stack.pop(), stack.pop()
                    if ele == '+':
                        curr = a + b
                        stack.append(curr)
                    elif ele == '-':
                        curr = a - b
                        stack.append(curr)
                    elif ele == '*':
                        curr = a * b
                        stack.append(curr)
                    elif ele == '/':
                        if a * b > 0:
                            curr = a // b
                        else:
                            curr = -(abs(a) // abs(b))
                        stack.append(curr)
                else:
                    stack.append(int(ele))

            else:
                if ele in operators:
                    return None
                else:
                    stack.append(int(ele))
        
        return stack.pop()

你可能感兴趣的:(150. Evaluate Reverse Polish Notation-LeetCode-Python)