中缀表达式转化为后缀表达式
2015-04-17 17:05
288 查看
package com.readcity.proxy; import java.util.Stack; class MiddleEvaluator { <span style="white-space:pre"> </span>private static final char ADD = '+'; <span style="white-space:pre"> </span>private static final char SUB = '-'; <span style="white-space:pre"> </span>private static final char MUL = '*'; <span style="white-space:pre"> </span>private static final char DIV = '/'; <span style="white-space:pre"> </span>private static final char LEFT_BRACKET = '('; <span style="white-space:pre"> </span>private static final char RIGHT_BRACKET = ')'; <span style="white-space:pre"> </span>private Stack<Character> stack; <span style="white-space:pre"> </span>private StringBuilder result; <span style="white-space:pre"> </span>public MiddleEvaluator() { <span style="white-space:pre"> </span>stack = new Stack<Character>(); <span style="white-space:pre"> </span>result = new StringBuilder(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void convertPostfix(String expression) { <span style="white-space:pre"> </span>String[] tokens = expression.split(";"); <span style="white-space:pre"> </span>for (int i = 0; i < tokens.length; i++) { <span style="white-space:pre"> </span>String token = tokens[i].trim(); <span style="white-space:pre"> </span>if (isNumber(token)) { <span style="white-space:pre"> </span>result.append(token); <span style="white-space:pre"> </span>} else { <span style="white-space:pre"> </span>char operator = token.charAt(0); <span style="white-space:pre"> </span>// 处理"(" <span style="white-space:pre"> </span>if (operator == LEFT_BRACKET) { <span style="white-space:pre"> </span>stack.push(operator); <span style="white-space:pre"> </span>continue; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>// 处理")" <span style="white-space:pre"> </span>if (operator == RIGHT_BRACKET) { <span style="white-space:pre"> </span>boolean flag = true; <span style="white-space:pre"> </span>do { <span style="white-space:pre"> </span>char ch = stack.pop(); <span style="white-space:pre"> </span>if (ch == LEFT_BRACKET) { <span style="white-space:pre"> </span>flag = false; <span style="white-space:pre"> </span>} else { <span style="white-space:pre"> </span>result.append(ch); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} while (flag); <span style="white-space:pre"> </span>continue; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>// 只处理+、-、*、/操作符 <span style="white-space:pre"> </span>if (!stack.isEmpty()) { <span style="white-space:pre"> </span>handleCommonOperator(operator); <span style="white-space:pre"> </span>} else { // 栈空直接插入操作符 <span style="white-space:pre"> </span>stack.push(operator); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while (!stack.isEmpty()) { <span style="white-space:pre"> </span>char ch = stack.pop(); <span style="white-space:pre"> </span>result.append(ch); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>private void handleCommonOperator(final char operator) { <span style="white-space:pre"> </span>if (stack.isEmpty()) { <span style="white-space:pre"> </span>stack.push(operator); <span style="white-space:pre"> </span>return; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>char topOperator = stack.peek(); <span style="white-space:pre"> </span>int topPri = getPriority(topOperator); <span style="white-space:pre"> </span>if (topPri != 3) { // 栈顶是非左括号 <span style="white-space:pre"> </span>int pri = getPriority(operator); <span style="white-space:pre"> </span>if (topPri >= pri) { // 栈顶的操作符优先级大于传入的操作符优先级,则弹出栈顶操作符 <span style="white-space:pre"> </span>char ch = stack.pop(); <span style="white-space:pre"> </span>result.append(ch); <span style="white-space:pre"> </span>handleCommonOperator(operator); <span style="white-space:pre"> </span>} else { <span style="white-space:pre"> </span>stack.push(operator); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} else { // 栈顶是左括号,则直接插入新的操作符 <span style="white-space:pre"> </span>stack.push(operator); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>private int getPriority(char operator) { <span style="white-space:pre"> </span>if (operator == LEFT_BRACKET || operator == RIGHT_BRACKET) { <span style="white-space:pre"> </span>return 3; <span style="white-space:pre"> </span>} else if (operator == MUL || operator == DIV) { <span style="white-space:pre"> </span>return 2; <span style="white-space:pre"> </span>} else { <span style="white-space:pre"> </span>return 1; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>private boolean isNumber(String token) { <span style="white-space:pre"> </span>for (int i = 0; i < token.length(); i++) { <span style="white-space:pre"> </span>if (!('0' <= token.charAt(i) && token.charAt(i) <= '9')) { <span style="white-space:pre"> </span>return false; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>return true; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public String getResult() { <span style="white-space:pre"> </span>return result.toString(); <span style="white-space:pre"> </span>} } public class Ope { <span style="white-space:pre"> </span>public static void main(String[] args) { <span style="white-space:pre"> </span>String expression = "5;+;(;4;-;5;+;1;);-;4;+;(;6;-;5;+;3;);+;2;"; <span style="white-space:pre"> </span>MiddleEvaluator evaluator = new MiddleEvaluator(); <span style="white-space:pre"> </span>evaluator.convertPostfix(expression); <span style="white-space:pre"> </span>System.out.println("中缀表达式转化为后缀表达式,结果:" + evaluator.getResult()); <span style="white-space:pre"> </span>String expression1 = "5;+;(;4;-;5;*;1;);-;4;/;(;6;*;5;+;3;);/;2;"; <span style="white-space:pre"> </span>MiddleEvaluator evaluator1 = new MiddleEvaluator(); <span style="white-space:pre"> </span>evaluator1.convertPostfix(expression1); <span style="white-space:pre"> </span>System.out.println("中缀表达式转化为后缀表达式,结果:" + evaluator1.getResult()); <span style="white-space:pre"> </span>} }
总结:根据前面中缀表达式转后缀表达式的原则,做出来了。如何做测试呢?最后拿人家写的输入,看看我写的程序结果是否和它的一致。
http://blog.csdn.net/linminqin/article/details/6838026
当明白了中缀表达式原理,使用程序来写出来,就可以加深映像。
相关文章推荐
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 栈的应用:中缀表达式转化为后缀表达式(逆波兰表达式)
- 中缀表达式转化为后缀表达式(栈的应用)
- 栈应用之将中缀表达式转化为后缀表达式(逆波兰表达式)
- 将中缀表达式转化为后缀表达式
- 将中缀表达式转化为后缀表达式
- 数据结构算法:中缀表达式转化为后缀表达式
- 中缀表达式转化为后缀表达式
- 将中缀表达式转化为后缀表达式
- 中缀表达式转化为后缀表达式、后缀表达式求解(栈)
- 中缀表达式到后缀表达式之间的转化
- 中缀表达式转化为后缀表达式(栈的应用)
- 把中缀表达式转化为后缀表达式
- 将中缀表达式转化成后缀表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 中缀表达式转化为后缀表达式,并计算后缀表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 中缀表达式转化为后缀表达式
- 简单计算器求值(中缀表达式转化成后缀表达式)