您的位置:首页 > 编程语言 > Java开发

JAVA中缀表达式转后缀表达式

2017-03-23 17:15 225 查看
基于前述文章,将代码改写,把中缀表达式转为后缀表达式

package com.后缀表达式;

import java.util.ArrayList;
import java.util.Stack;

public class 生成后缀表达式 {

public static void main(String[] args) {
System.out.println(generate("8547*92+(1+2)"));
}

public static String bracketGet(String s, int k) {
int m=0;
int i;
String[] arr=convert(s);
for(i=k;i<arr.length;i++){
if(arr[i].equals("(")){
m++;
continue;
}
if(arr[i].equals(")")){
m--;
if(m==0)
break;
else
continue;
}

}
StringBuilder sb=new StringBuilder();
for(int j=k+1;j<i;j++){
sb.append(arr[j]);
}
return sb.toString();
}

public static String generate(String formula) {
String[] arr = convert(formula);
StringBuffer buffer = new StringBuffer();
Stack<String> op = new Stack<>();
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals("(")) {
buffer.append(generate(bracketGet(formula, i)));
i = i + bracketGet(formula, i).length() + 1;
} else if (arr[i].equals("+") || arr[i].equals("-") || arr[i].equals("*") || arr[i].equals("/")) {
while (!op.isEmpty() && opcompare2(op.lastElement(), arr[i])) {
buffer.append(op.pop()+" ");
}
op.push(arr[i]);
} else
buffer.append(arr[i]+" ");
}

while (!op.isEmpty()) {
buffer.append(op.pop()+" ");

}

return buffer.toString();

}

public static String[] convert(String s) {
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
if (!opjudge(s.charAt(i))) {
int j = i;
while ((i < s.length()) && !opjudge(s.charAt(i)))
i++;
arrayList.add(s.substring(j, i));
i--;
} else
arrayList.add(String.valueOf(s.charAt(i)));
}

return arrayList.toArray(new String[arrayList.size()]);

}

public static boolean opjudge(char c) {
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' ||
94ae
c == ')')
return true;
else
return false;
}

public static int opvalue2(String s) {
switch (s) {
case "+":
return 1;
case "-":
return 2;
case "*":
return 3;
case "/":
return 4;
default:
return -1;
}

}

public static boolean opcompare2(String s1, String s2) {
if (opvalue2(s1) >= opvalue2(s2))
return true;
else {
return false;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: