逆波兰表示

20世纪50年代,波兰逻辑学家提出了一种不需要括号的后缀表示法,也成为逆波兰(Reverse Polish Notatiojn ,RPN)表示。

后缀表达式:所有的符号都要在要运算的数字的后面出现。例如:“9+(3-1)x3+10/2”后缀表达式为:“9 3 1 - 3 * + 10 2 / +”

后缀表达式计算结果

对于“9 3 1 - 3 * + 10 2 / +”为例:

  1. 初始化空栈
  2. 9、3、1进栈,栈为9-3-1
  3. 对于“-”,1出栈作为减数,3出栈作为被减数,结果得到2再次进栈,栈为9-2
  4. 3 进栈,栈2为9-3-2
  5. 对于“*”,3出栈,2出栈,得到6,结果入栈,栈为9-6
  6. 对于“+”,6出栈,9出栈,得到15,结果入栈,栈为15
  7. 10和2进栈,栈为15-10-2
  8. 对于“\”,2出栈,10出栈,得到5,结果入栈,栈为15-5
  9. 对于“+”,5出栈,15出栈,得到20,结果入栈,栈为20
  10. 20出栈,栈为空。
import java.util.Stack;

public class RPN {
    public static int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<Integer>();
        for(int i = 0;i<tokens.length;i++){
            try{
                int num = Integer.parseInt(tokens[i]);
                stack.add(num);
            }catch (Exception e) {
                int b = stack.pop();
                int a = stack.pop();
                stack.add(get(a, b, tokens[i]));
            }
        }
        return stack.pop();
    }
    private static int get(int a,int b,String operator){
        switch (operator) {
        case "+":
            return a+b;
        case "-":
            return a-b;
        case "*":
            return a*b;
        case "/":
            return a/b;
        default:
            return 0;
        }
    }

    
    public static void main(String[] args) {
        String[] strlist = {"2", "1", "+", "3", "*"};
        System.out.println(evalRPN(strlist));
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文链接: Evaluate Reverse Polish Notation 逆波兰表示法是计算一个算法表达式中的...
    _凌浩雨阅读 1,146评论 0 2
  • 曾经有一份美好的爱情放在我的面前我没有珍惜。等到失去后才后悔莫及。如果可以再对小李说。毛欣想说。这辈子无缘再牵手。...
    毛欣与小李阅读 2,661评论 0 13
  • 1.栈 1.1.栈的定义 栈(stack)是限定仅在表尾(栈顶 top)进行插入和删除操作的后进先出的线性表。 p...
    JonyFang阅读 1,410评论 0 21
  • 我遇见你,在曾经 我找寻你,在今天 路上的行人都很像你 我不知道你发型有没有变 还没忘的是你的名字 我努力在找回你...
    洋葱头llk阅读 116评论 0 1
  • 《拟挽歌辞 其三》 —— 陶渊明荒草何茫茫,白杨亦萧萧。严霜九月中,送我出远郊。四面无人居,高坟正嶕峣。马为仰天鸣...
    岚风的叶子阅读 235评论 0 0