中序表达式转后序表达式的java实现

来源:互联网 发布:淘宝定制t恤好做吗 编辑:程序博客网 时间:2024/06/05 11:46
<pre name="code" class="java">
//将一个中序表达式转换为后序表达式
public class InfixToPostfix {public static int compare(String s1, String s2){if((s1.equals("+")||s1.equals("-"))&&(s2.equals("*")||s2.equals("/")))return -1;else if((s1.equals("*")||s1.equals("/"))&&(s2.equals("+")||s2.equals("-")))return 1;else return 0;}public static void main(String[] args){String[] strs = StdIn.readStrings();ListStack<String> mascot = new ListStack<String>();String exp = "";for(int i = 0; i != strs.length; i++){if(strs[i].equals("("))mascot.push(strs[i]);else if(strs[i].equals(")")){String temp = mascot.pop();while(!temp.equals("(")){exp = exp + " " + temp;temp = mascot.pop();}}else if(strs[i].equals("+") || strs[i].equals("-")||strs[i].equals("/")||strs[i].equals("*")){if(mascot.isEmpty() || mascot.peek().equals("(") || (compare(strs[i], mascot.peek()) >= 0))mascot.push(strs[i]);else{while(!mascot.isEmpty() && compare(strs[i], mascot.peek())<=0 && !mascot.peek().equals("("))exp = exp + " " + mascot.pop();mascot.push(strs[i]);}}elseexp = exp + " " + strs[i];}while(!mascot.isEmpty())exp = exp + " " + mascot.pop();StdOut.println(exp);}}

*******************************************************************************************************

//对后序表达式进行求值
public class EvaluatePostfix {public static void main(String[] args){String[] strs = StdIn.readStrings();ListStack<Double> s = new ListStack<Double>();for(int i = 0; i != strs.length; i++){if(strs[i].equals("+") || strs[i].equals("-") ||strs[i].equals("/")||strs[i].equals("*")){double x1 = s.pop();double x2 = s.pop();switch(strs[i].charAt(0)){case '+':x1 = x1 + x2;break;case '-':x1 = x2 - x1;break;case '*':x1 = x1 * x2;break;case '/':x1 = x2 / x1;break;}s.push(x1);}elses.push(Double.parseDouble(strs[i]));}StdOut.println(s.pop());}}



0 0
原创粉丝点击