通过博客和自己的理解 自己用java实现了下 中缀表达式转逆波兰式代码如下
public static String nibolan(String dengshi){
dengshi = dengshi.replaceAll("\\s*", "");
StringBuffer nibolanReturn = new StringBuffer();
//新建一个集合 模仿栈
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < dengshi.length(); i++) {
String substring = dengshi.substring(i, i + 1);
//先判断当前字符是否是数字
Pattern pattern = Pattern.compile("[0-9]*");
if(pattern.matcher(substring).matches()){
//是数字输出
nibolanReturn.append(substring).append(" ");
}else{
//是运算符号 做判断入栈 和栈顶运算符做比较 如果优先级低过栈顶运算符 栈内符号就出栈
if(list.size()>0){
//如果新加的是加减 栈顶的是乘除 就输出栈顶
if(yunsuanfuyouxianji(list.get(list.size()-1),substring)){
//如果新加的是右括号 只输出左括号到右括号中间的数字
if(substring.equals(")")){
for (int j = list.size() - 1; j >= 0; j--) {
//如果栈内当前符号为左括号 说明括号内的符号已经都输出 结束循环
if(list.get(j).equals("(")){
list.remove(j);
break;
}
nibolanReturn.append(list.get(j)).append(" ");
list.remove(j);
}
}else {
//否则就是字符正常往栈内存储
for (int j = list.size() - 1; j >= 0; j--) {
nibolanReturn.append(list.get(j)).append(" ");
list.remove(j);
}
list.add(substring);
}
}else {
list.add(substring);
}
}else {
//栈内是空的 直接入栈
list.add(substring);
}
}
}
for (int j = list.size() - 1; j >= 0; j--) {
nibolanReturn.append(list.get(j)).append(" ");
list.remove(j);
}
return nibolanReturn.toString();
}
public static boolean yunsuanfuyouxianji(String start, String end){
if(start.equals("+")){
switch (end){
case "+":
return true;
case "-":
return true;
case ")":
return true;
}
}else if(start.equals("-")){
switch (end){
case "+":
return true;
case "-":
return true;
case ")":
return true;
}
}else if(start.equals("*")){
switch (end){
case "+":
return true;
case "-":
return true;
case ")":
return true;
}
}else if(start.equals("/")){
switch (end){
case "+":
return true;
case "-":
return true;
case ")":
return true;
}
}else if(start.equals(")")){
switch (end){
case "+":
return true;
case "-":
return true;
case ")":
return true;
}
}
return false;
}
public static void main(String[] args) throws Exception {
System.out.println(nibolan("1 + 2 * (((3 + 4) + 5) * 6)"));
}