您的位置:首页 > 其它

中缀表达式转化为后缀表达式

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
当明白了中缀表达式原理,使用程序来写出来,就可以加深映像。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: