lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目

逆波兰表达式求值

在逆波兰表达法中,其有效的运算符号包括 +-*/ 。每个运算对象可以是整数,也可以是另一个逆波兰计数表达。

样例

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

说明

什么是逆波兰表达式?

解题

利用栈的解题

当是数字的时候入栈,当不是数字的时候连续两次出栈,对出栈的数据进行运算,运算结果再入栈

如何判定是数字?

根据正则还是比较简单的

str.matches("\\d+") == true

需要注意的是:是负数的情况

str.substring(0,1).equals("-")&& str.substring(1,str.length()).matches("\\d+") == true

我是先判定第一个字符是“-” ,再判定是否是数字

后面就是对于四则运行就简单,注意非法字符,和除0的情况,我是直接返回最大值。

还有个要注意的是当在运算的过程中栈空了,说明输入的不是有效的逆波兰表达式

public class Solution {
    /**
     * @param tokens The Reverse Polish Notation
     * @return the value
     */
    public int evalRPN(String[] tokens) {
        // Write your code here
        if(tokens == null)
            return 0;
        if(tokens.length == 1)
            return Integer.valueOf(tokens[0]);
        Stack<Integer> stack = new Stack<Integer>();
        for(int i =0;i< tokens.length ;i++){
            String str = tokens[i];

            if(str.matches("\\d+") == true ||
                str.substring(0,1).equals("-")&&str.substring(1,str.length()).matches("\\d+") == true){
                int num = Integer.valueOf(str);
                stack.push(num);
            }else{
                if(stack.empty()){
                    System.out.println("the stack is empty");
                    return -1;
                }
                int num2 = stack.pop();
                int num1 = stack.pop();

                int res = calculate(num1,num2,str);
                stack.push(res);
            }
        }
        return stack.pop();
    }
    public int calculate(int num1,int num2,String symbol){
        if(symbol.equals("+"))
            return num1+ num2;
        if(symbol.equals("-"))
            return num1 - num2;
        if(symbol.equals("*"))
            return num1*num2;
        if(symbol.equals("/")){
            if(num2!=0){
                return num1/num2;
            }else{
                return Integer.MAX_VALUE;
            }
        }else{
            return Integer.MAX_VALUE;
        }
    }

}

Java Code

总耗时: 11103 ms

Python程序 出现1/-123 等于-1的问题,表示手工解决太愚蠢,程序如下

class Solution:
    # @param {string[]} tokens The Reverse Polish Notation
    # @return {int} the value
    def evalRPN(self, tokens):
        # Write your code here
        if tokens == None:
            return 0
        if len(tokens) == 1:
            return int(tokens[0])
        stack = []
        # print 13//3
        # print 13/3
        # print 6/(135) 0
        # print 6/(-135) -1
        for tk in tokens:
            if tk.isdigit() or tk[0] == ‘-‘ and tk[1:].isdigit():
                stack.append(int(tk))
            else:
                num2 = stack.pop()
                num1 = stack.pop()
                num = self.calculate(num1,num2,tk)
                stack.append(num)
            if(len(tokens) == 13):
                print stack
        return stack.pop()

    def calculate(self,num1,num2,sign):
        if sign ==‘-‘:
            return num1 - num2
        elif sign == ‘+‘:
            return num1 + num2
        elif sign == ‘*‘:
            return num1 * num2
        elif sign == ‘/‘:
            if num2!=0:
                return -num1//num2
            else:
                return 0
        else:
            return 0

Python Code

时间: 2024-10-27 03:51:46

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值的相关文章

Java Evaluate Reverse Polish Notation(逆波兰表达式)

表达式:: ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9   ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6 题目大意:给定一个逆波兰表达式,求该表达式的值 思路:由于逆波兰表达式本身

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. Some examples: ["2", "1", "+", "3", "*"] -&g

LeetCode:逆波兰表达式求值【150】

LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除数为 0 的情况. 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2

逆波兰表达式求值424

1.求逆波兰表达式的值. 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -

[Swift]LeetCode150. 逆波兰表达式求值 | 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

逆波兰表达式求值

根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除数为 0 的情况. 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9 示例 2: 输入: [&qu

[LeetCode] 150. 逆波兰表达式求值

题目链接 : https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/ 题目描述: 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除数为 0 的情况. 示例: 示例 1: 输入: ["2", "1", &qu

leetcode 150. 逆波兰表达式求值(栈)

根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除数为 0 的情况. 示例 1: 输入: ["2", "1", "+", "3", "*"] 输出: 9 解释: ((2 + 1) * 3) = 9 示例 2: 输入: [&qu

leetcode——150. 逆波兰表达式求值

class Solution(object): def evalRPN(self, tokens): """ :type tokens: List[str] :rtype: int """ stack=[] for i in tokens: if i not in '+-*/': stack.append(i) else: a=stack.pop() b=stack.pop() if i=='+': c=int(a)+int(b) stack.a