【算法】程序猿不写代码是不对的36

package com.kingdz.algorithm.time201703;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Stack;

import com.kingdz.algorithm.time201702.Algo07;

/**
 * 中序表达式转后序表达式
 * 
 * @author kingdz
 * 
 */
public class Algo28 {

	public static void main(String[] args) {
		String question = "2*3/(2-1)+3*(4-1)";
		String post = toPost(question);
		System.out.println(post);
	}

	private static String toPost(String question) {
		StringBuilder strb = new StringBuilder();
		List<String> list = Algo07.dismantle(question);

		Stack<String> stack = new Stack<String>();
		Set<String> oper = new HashSet<String>();
		for (String str : Algo07.separator) {
			oper.add(str);
		}

		for (String str : list) {
			if (!oper.contains(str)) {
				strb.append(str + " ");
			} else {
				if (str.equals("(")) {
					stack.push(str);
				} else if (str.equals(")")) {
					while (!stack.isEmpty()) {
						String up = stack.pop();
						if (up.equals("(")) {
							break;
						} else {
							strb.append(up + " ");
						}
					}
				} else {
					int now = getPri(str);
					while (!stack.isEmpty()) {
						int top = getPri(stack.peek());
						if (top > now) {
							strb.append(stack.pop() + " ");
						} else {
							stack.push(str);
							break;
						}
					}
					if (stack.isEmpty()) {
						stack.push(str);
					}
				}
			}
		}
		while (!stack.isEmpty()) {
			strb.append(stack.pop() + " ");
		}

		return strb.toString();
	}

	/**
	 * 获得操作符优先级
	 * 
	 * @param str
	 * @return
	 */
	private static int getPri(String str) {
		if (str.equals("+")) {
			return 1;
		} else if (str.equals("-")) {
			return 1;
		} else if (str.equals("*")) {
			return 2;
		} else if (str.equals("/")) {
			return 2;
		} else {
			return 0;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值