java实现中缀表达式转换成后缀表达式

完整代码:

import java.util.Scanner;
import java.util.Stack;
import org.junit.Test;

/**
 * 中缀表达式 -> 后缀表达式
 * @author itis666
 */
public class InfixToSuffix {

	/**
	 * 将中缀表达式转换成后缀表达式
	 * @param resExp 原始输入的中缀表达式
	 * @return 返回后缀表达式
	 */
	public String inExpToSuffixExp(String resExp) {
		String[] inExp = dealInExp(resExp).split(",");
		Stack<String> stack = new Stack<>();
		StringBuilder suffixExp = new StringBuilder();
		for (String s : inExp) {
			if (!isOperator(s)) {
				// 遇到数字,直接输出
				suffixExp.append(s + ",");
			} else if ("(".equals(s)) {
				// 遇到左括号,直接压栈
				stack.push(s);
			} else if (")".equals(s)) {
				// 遇到右括号,将栈顶元素依次弹出,直至遇到左括号
				while (!"(".equals(stack.get(stack.size() - 1))) {
					suffixExp.append(stack.pop() + ",");
				}
				// 弹出左括号但不输出
				stack.pop();
			} else if (isOperator(s)) {
				// 遇到运算符,当前运算符优先级小于等于栈顶运算符优先级,将栈顶运算符弹出
				// 当前运算符继续和新的栈顶运算符比较...
				while (!stack.isEmpty() 
				&&getPriority(s) <= getPriority(stack.get(stack.size()-1))){
					suffixExp.append(stack.pop() + ",");
				}
				stack.push(s);
			}
		}
		// 最后,将栈内还没有弹出的运算符依次弹出
		while (!stack.isEmpty()) {
			suffixExp.append(stack.pop() + ",");
		}
		// 去除最后一个,号
		suffixExp.delete(suffixExp.length() - 1, suffixExp.length());
		return suffixExp.toString();
	}

	/**
	 * 预处理中缀表达式
	 * @param inExp 原始中缀表达式
	 * @return 返回处理后的中缀表达式
	 */
	private String dealInExp(String resExp) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < resExp.length(); i++) {
			String tmp = resExp.substring(i, i + 1);
			if (!isOperator(tmp)) {
				sb.append(tmp);
			} else {
				if (sb.length() == 0) {
					sb.append(tmp + ",");
				} else if (sb.charAt(sb.length() - 1) == ',') {
					sb.append(tmp + ",");
				} else {
					sb.append("," + tmp + ",");
				}
			}
		}
		return sb.toString();
	}

	/**
	 * 判断是不是运算符
	 * @param str 待判断的字符
	 * @return 返回判断结果
	 */
	private boolean isOperator(String str) {
		return "+-*/()".contains(str);
	}

	/**
	 * 获取运算符的优先级
	 * @param operator 运算符
	 * @return 返回运算符的优先级
	 */
	private int getPriority(String operator) {
		return "()+-*/".indexOf(operator)/2;
	}

	@Test
	public void test() {
		Scanner sc = new Scanner(System.in);
		String resExp = sc.nextLine();
		System.out.println("后缀表达式:"+inExpToSuffixExp(resExp));
	}

}

测试运行1:

66.623*6.5+(20.61+53*69*(2.6+6.9*5))*3.9-6.6
后缀表达式:66.623,6.5,*,20.61,53,69,*,2.6,6.9,5,*,+,*,+,3.9,*,+,6.6,-

测试运行2:

((6*10-62*9)*6+(56-9*66))*6-5
后缀表达式:6,10,*,62,9,*,-,6,*,56,9,66,*,-,+,6,*,5,-

你可能感兴趣的:(java)