`

Evaluate Reverse Polish Notation

 
阅读更多
Evaluate Reverse Polish Notation(逆波兰表达式)

表达式一般由操作数(Operand)、运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间,
这称为中缀表达式(Infix Expression),如A+B。
波兰数学家Jan Lukasiewicz提出了另一种数学表示法,它有两种表示形式:
把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB;
把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Expression)或后缀表达式(Suffix Expression),如AB+;
其中,逆波兰表达式在编译技术中有着普遍的应用。

算法:
一、 将中缀表达式转换成后缀表达式算法:
1、从左至右扫描一中缀表达式。
2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈
3、若读取的是运算符
  (1) 该运算符为左括号"(",则直接存入运算符堆栈。
  (2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。
  (3) 该运算符为非括号运算符:
      (a) 若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。
      (b) 若比运算符堆栈栈顶的运算符优先级高或相等,则直接存入运算符堆栈。
      (c) 若比运算符堆栈栈顶的运算符优先级低,则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈。
4、当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。

二、逆波兰表达式求值算法:
1、循环扫描语法单元的项目。
2、如果扫描的项目是操作数,则将其压入操作数堆栈,并扫描下一个项目。
3、如果扫描的项目是一个二元运算符,则对栈的顶上两个操作数执行该运算。
4、如果扫描的项目是一个一元运算符,则对栈的最顶上操作数执行该运算。
5、将运算结果重新压入堆栈。
6、重复步骤2-5,堆栈中即为结果值。



public class Solution {
    public int evalRPN(String[] tokens) {
 
        int returnValue = 0;
 
        String operators = "+-*/";
 
        Stack<String> stack = new Stack<String>();
 
        for(String t : tokens){
            if(!operators.contains(t)){
                stack.push(t);
            }else{
                int a = Integer.valueOf(stack.pop());
                int b = Integer.valueOf(stack.pop());
                int index = operators.indexOf(t);
                switch(index){
                    case 0:
                        stack.push(String.valueOf(a+b));
                        break;
                    case 1:
                        stack.push(String.valueOf(b-a));
                        break;
                    case 2:
                        stack.push(String.valueOf(a*b));
                        break;
                    case 3:
                        stack.push(String.valueOf(b/a));
                        break;
                }
            }
        }
 
        returnValue = Integer.valueOf(stack.pop());
 
        return returnValue;
 
    }
}

参考
http://www.programcreek.com/2012/12/leetcode-evaluate-reverse-polish-notation/
http://blog.csdn.net/geniusluzh/article/details/8192780
http://www.cnblogs.com/wanghetao/archive/2012/04/23/2466580.html
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Coding Interview In Java

    3 Evaluate Reverse Polish Notation 21 4 Isomorphic Strings 25 5 Word Ladder 27 6 Word Ladder II 29 7 Median of Two Sorted Arrays 33 8 Kth Largest Element in an Array 35 9 Wildcard Matching 37 10 ...

    js-leetcode题解之150-evaluate-reverse-polish-notation.js

    javascript js_leetcode题解之150-evaluate-reverse-polish-notation.js

    python-leetcode题解之150-Evaluate-Reverse-Polish-Notation.py

    python python_leetcode题解之150_Evaluate_Reverse_Polish_Notation.py

    Leetcode的ac是什么意思-LeetCodeInJava:leetcode-java

    #150 Evaluate Reverse Polish Notation #169 Majority Element #171 Excel Sheet Column Number #217 Contains Duplicate #226 Invert Binary Tree #237 Delete Node in a Linked List #238 Product of Array ...

    10个最常见的Java算法.doc

    * 经典问题:Evaluate Reverse Polish Notation, Longest Palindromic Substring, 单词分割, 字梯, Median of Two Sorted Arrays, 正则表达式匹配, 合并间隔, 插入间隔, Two Sum, 3Sum, 4Sum, 3Sum Closest, String ...

    LeetCode题解 - Java语言实现-181页.pdf

    2. Evaluate Reverse Polish Notation 逆波兰表示法是一种数学表达式表示法,需要将中缀表达式转换为后缀表达式。可以使用栈来解析逆波兰表示法,实现表达式的计算。 3. Solution of Longest Palindromic ...

    LeetCode题解(java语言实现).pdf

    * Evaluate Reverse Polish Notation:该题目要求对逆波兰表示法的字符串进行求值,实现方法使用了栈的数据结构。 * Solution of Longest Palindromic Substring in Java:该题目要求找到最长的回文子串,实现方法...

    春节7天练丨Day2:栈、队列和递归1

    3. **Evaluate Reverse Polish Notation**:逆波兰表达式求值,使用栈处理运算符和操作数,依次计算得到最终结果。 ### 队列 队列是一种遵循“先进先出”(First In First Out, FIFO)原则的数据结构。常见的操作...

    CleanCodeHandbook_v1.0.3

    - Evaluate Reverse Polish Notation(逆波兰表达式求值) 10. Dynamic Programming(动态规划): 动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,用于求解决策过程最优化问题的...

    leetcode java

    - 逆波兰表达式求值(Evaluate Reverse Polish Notation)则是关于后缀表达式的计算。 **动态规划(Dynamic Programming)** 动态规划是解决具有重叠子问题和最优子结构特性的问题的方法。 - "爬楼梯"(Climbing ...

    常见算法题答案及解析

    40. Evaluate Reverse Polish Notation:计算后缀表达式的值。 41. Valid Parentheses:判断字符串是否为有效的括号字符串。 七、动态规划 42. Climbing Stairs:计算爬楼梯的方案数。 43. Unique Paths:不同路径...

    javalruleetcode-leetcode:这是Java写的leetcode

    [Java](./src/Evaluate Reverse Polish Notation/Solution.java) 2013/11/27 中等的 [Java](./src/直线上的最大点数/Solution.java) 2013/11/22 难的 [Java](./src/排序列表/Solution.java) 2013/11/16 中等的 [Java...

    Leetcode book刷题必备

    40. Evaluate Reverse Polish Notation:计算后缀表达式。 41. Valid Parentheses:验证括号的有效性。 【动态规划】 42. Climbing Stairs:计算爬楼梯的不同方法数。 43. Unique Paths:机器人在一个 m x n 的网格...

    LeetCode判断字符串是否循环-leetcode:用lin编码

    Notation(150) Vector 向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, ...

    leetcode双人赛-Algorithm:leetcode算法刷题总结,长期更新,欢迎探讨与指正

    [leetcode]150.Evaluate Reverse Polish Notation 题目: ["2", "1", "+", "3", "*"] -&gt; ((2 + 1) * 3) -&gt; 9 ["4", "13", "5", "/", "+"] -&gt; (4 + (13 / 5)) -&gt; 6 思路:每次遇到符号,出栈两个元素进行运算,并将...

    leetcode中国-leetcode:刷算法了

    Evaluate Reverse Polish Notation 逆波兰的后半截实现 Linked List Cycle 快慢指针 Linked List Cycle II 快慢指针再加个初始指针 慢指针到链表开始位置时, 快指针总是比他快k步(每次移动快1步, 移动k次), 第一次...

    LeetCode最全代码

    190 | [Reverse Bits](https://leetcode.com/problems/reverse-bits/) | [C++](./C++/reverse-bits.cpp) [Python](./Python/reverse-bits.py) | _O(1)_ | _O(1)_ | Easy ||| 191 |[Number of 1 Bits]...

    波兰表达式c语言递归实现

    与之相对的是逆波兰表达式(Reverse Polish Notation,RPN),也就是通常所说的后缀表达式,其中的运算符位于操作数之后。 在C语言中,实现波兰表达式求值的递归函数是一个经典的例子,用于展示递归的概念。下面是...

Global site tag (gtag.js) - Google Analytics