import java.util.ArrayList;
import java.util.Stack;
public class MediumToLast {//中缀表达式转后缀(默认字符串无异常)
public static void main(String[] args) {
//a+b*c+(d*e+f)*g
ArrayList<Character> list = new MediumToLast().change("a/b+c*d");
for (Character character : list) {
System.out.print(character+" ");
}
}
public ArrayList<Character> change(String s){
Stack<Character> stack = new Stack<>();//用来存储运算符
ArrayList<Character> result = new ArrayList<>();
char[] charArray = s.toCharArray();
for (char c : charArray) {
if(c>='a'&&c<='z'){
//如果是数字
result.add(c);
}else{
if(stack.isEmpty()){
//如果栈空
stack.push(c);
}else{
if(c==')'){//特殊处理右括号的情况
while(stack.peek()!='('){
result.add(stack.pop());
}
stack.pop();
continue;
}
int temp = 0;
while(true){
if(stack.isEmpty()||calcPriorityLv(stack.peek(),c)<0){//若栈空或者栈顶符号的优先级小于C 注意栈空的情况
stack.push(c);
break;
}else if(calcPriorityLv(stack.peek(),c)==0){//优先级相同时先弹(即先处理)再压栈
result.add(stack.pop());
stack.add(c);
break;
}else{
if(stack.peek()=='('){//栈顶是(时的特殊处理 无视( 继续压栈
stack.push(c);
break;
}
result.add(stack.pop());
}
}
}
}
}
while (!stack.isEmpty()){
result.add(stack.pop());
}
return result;
}
public int calcPriorityLv(char a, char b){//计算优先级
return definePriorityLv(a) - definePriorityLv(b); // 若a的优先级更大 返回值>0 若b的优先级更大 返回值<0
}
public int definePriorityLv(char a){//定义优先级数值
if(a == '+' || a == '-'){
return 1;
}
if(a == '*' || a == '/'){
return 2;
}
if(a == '(' || a == ')'){
return 3;
}
return 0;
}
}