中缀转后缀表达式

package com.daelly.algorithm.stack.express;

import java.util.Stack;

/**
 * 中缀表达式转后缀表达式
 * 使用的数据结构:一个栈
 * 思路:
 * 遍历中缀表达式,如果当前字符不是操作符(+、-、*、/、(、)),直接将当前字符append到结果。
 * 如果是操作符,循环和栈顶的操作符比较优先级,大于栈顶操作符优先级则入栈,否则pop栈顶操作符到结果串;直到条件不满足或栈为空或碰到'(';
 * '(',如果不是')'碰到它,则将他看做子栈。
 * 遍历完中缀串后,将栈里残留的操作符一次append到结果。
 * @author daelly
 *
 */
public class Infix2PostfixExp {

	public static String infix2postfix(String exp) {
		Stack<Character> ops = new Stack<>();
		StringBuffer sb = new StringBuffer();
		for(int i=0;i<exp.length();i++) {
			char ch = exp.charAt(i);
			if(!isOperator(ch)) {
				sb.append(ch);
				continue;
			} else if(ops.isEmpty()||ops.peek()=='(') {
				ops.push(ch);
				continue;
			}
			switch (ch) {
			case '+':
			case '-':
				while(!ops.isEmpty() && ops.peek()!='(') {
					sb.append(ops.pop());
				}
				ops.push(ch);
				break;
			case '*':
			case '/':
				while(!ops.isEmpty() && ops.peek()!='+' && ops.peek()!='-'){
					sb.append(ops.pop());
				}
				ops.push(ch);
				break;
			case '(':
				ops.push(ch);
				break;
			case ')':
				char top = '\0';
				while((top=ops.pop())!='(') {
					sb.append(top);
				}
				break;
			default:
				break;
			}
		}
		while(!ops.isEmpty()) {
			sb.append(ops.pop());
		}
		return sb.toString();
	}
	
	/**
	 * 是否是操作符
	 * @param ch
	 * @return
	 */
	public static boolean isOperator(char ch) {
		return ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='(' || ch==')';
	}
	
	public static void main(String[] args) {
		String exp = "a+b*c";
		System.out.println(infix2postfix(exp));
		exp = "a*(b+c)";
		System.out.println(infix2postfix(exp));
		exp = "a+b*c-d*(e+f*g-h)";
		System.out.println(infix2postfix(exp));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值