Live2D

中缀表达式转后缀表达式(Java)

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;
    }
}
posted @ 2021-01-21 11:50  细雪之舞0213  阅读(66)  评论(0)    收藏  举报