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;
}
}
}
【算法】程序猿不写代码是不对的36
最新推荐文章于 2019-12-14 15:35:20 发布