主要思路:和1.3.9相似,只不过运算表达式的生成方式不一样
用Dijkstra的双栈算法。
遇到数字则压入数字栈中(String)。
遇到运算符则压入运算符栈中(String)。
遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达式(后缀表示)。
再次压入数字栈中(String)。
最后从数字栈中弹出最终的运算表达式。
方法实现:
//1.3.10 //only support +-*/ operator package com.qiusongde; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class InfixToPostfix { public static void main(String[] args) { Stack<String> ops = new Stack<String>(); Stack<String> vals = new Stack<String>(); while(!StdIn.isEmpty()) { String s = StdIn.readString(); if(s.equals("(")) ; else if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) { ops.push(s); } else if(s.equals(")")) { String op = ops.pop();//operator String v = vals.pop();//value //only support +-*/ operator String subexpression = vals.pop() + " " + v + " " + op; vals.push(subexpression); } else { vals.push(s); } } StdOut.println(vals.pop()); } }
测试结果: