package work1;
import java.util.*;
public class InffixToSuffix {
private String []expressionCharArray;
private List<String> newExpressionCharArray;
private Stack<String> stack;
public String inffixToSuffix(String expression) {
this.InitParam(expression);
for (int i = 0; i < expressionCharArray.length; i++) {
if ("(".equals(expressionCharArray[i])) {
this.dealLeftBracket(i);
} else if ("+".equals(expressionCharArray[i]) || "-".equals(expressionCharArray[i]) || "*".equals(expressionCharArray[i]) || "/".equals(expressionCharArray[i])) {
this.dealOpeartor(i);
} else if (")".equals(expressionCharArray[i])) {
this.dealRightBracket(i);
} else {
this.dealNormalChar(i);
}
}
this.dealFinalCharsInStack();
return this.stringArrayToString(newExpressionCharArray);
}
private void InitParam(String expression){
expressionCharArray=this.stringToStringArray(expression);
newExpressionCharArray=new ArrayList<>();
stack=new Stack<>();
stack.push("@");
}
public boolean comparePrior(String operator1, String operator2) {
if(getPrioryty(operator1)<=getPrioryty(operator2))
return false;
else
return true;
}
private int getPrioryty(String operator){
switch (operator) {
case "*":
case "/":
return 2;
case "+":
case "-":
return 1;
case "(":
return 0;
case "@":
return -1;
default:
break;
}
return 0;
}
private void dealLeftBracket(int index){
stack.push(expressionCharArray[index]); // 如果是左括号,则入栈
}
private void dealRightBracket(int index){
try{
this.subDealRightBracket(index);
}
catch(Exception e){
System.out.println("输入格式错误,括号不匹配!");
System.exit(0);
}
}
private void subDealRightBracket(int index){
while (!"(".equals(stack.peek())) { //如果是")",则出栈,一直到遇到"("
String s = stack.pop();
newExpressionCharArray.add(s);
}
stack.pop();
}
private void dealOpeartor(int index){
String s = stack.pop();
if(comparePrior(expressionCharArray[index], s)) { //如果栈值优先级小于要入栈的值,则继续压入栈
stack.push(s);
} else { //否则取出值
newExpressionCharArray.add(s);
}
stack.push(expressionCharArray[index]);
}
private void dealNormalChar(int index){
newExpressionCharArray.add(expressionCharArray[index]);
}
private void dealFinalCharsInStack(){
while (!"@".equals(stack.peek())) {
String s = stack.pop();
this.dealFinalCharsHaveLeftBracket(s);
newExpressionCharArray.add(s);
}
}
private void dealFinalCharsHaveLeftBracket(String s){
if(ifHaveLeftBracket(s)){
System.out.println("输入格式错误,括号不匹配!");
System.exit(0);
}
}
private boolean ifHaveLeftBracket(String s){
if(s.equals("("))
return true;
else
return false;
}
private String[] stringToStringArray(String expression){
String[] expressionArray=new String[expression.length()];
for(int i=0;i<expression.length();i++){
char[] tempChar=new char[1];
tempChar[0]=expression.charAt(i);
expressionArray[i]=new String(tempChar);
}
return expressionArray;
}
private String stringArrayToString(List<String> expressionArray){
String expression="";
for (String expressionPart:expressionArray)
expression=expression+expressionPart;
return expression;
}
public static void main( String args[] ){
InffixToSuffix inffixToSuffix=new InffixToSuffix();
String test=new String("1*(2+8)");
System.out.println(inffixToSuffix.inffixToSuffix(test));
test="1*(2*(3-4))";
System.out.println(inffixToSuffix.inffixToSuffix(test));
}
}