java计算器 中缀转后缀(不喜勿喷,没有毕业的时候写的)

public class InfixToSuffix {
 
    static Stack<String> signStack = new Stack<String>();//存放运算符的S1
    static Stack<String> middleResultStack = new Stack<String>();//存放中间结果的S2
 
    public static Stack<String> getExpression(String Infix) {
 
        System.out.println("(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2");
 
        //从左至右扫描中缀表达式
        System.out.println("(2)从左至右扫描中缀表达式");
        for (int index = 0; index < Infix.length(); index++) {
 
            if (Character.isUpperCase(Infix.charAt(index))) {
                //遇到操作数时,将其压入S2
                System.out.println("(3)遇到操作数时,将其压入S2   " + String.valueOf(Infix.charAt(index)));
                middleResultStack.push(String.valueOf(Infix.charAt(index)));
            } else {
 
                System.out.println("(4)遇到运算符时,比较其与S1栈顶运算符的优先级");
 
                if (signStack.isEmpty()) {
                    //如果S1为空,则直接将此运算符入栈
                    System.out.println("(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈    " + String.valueOf(Infix.charAt(index)));
                    signStack.push(String.valueOf(Infix.charAt(index)));
                } else {
 
                    //遇到运算符时,比较其与S1栈顶运算符的优先级
                    char operator = Infix.charAt(index);
                    switch (operator) {
                    case '+' :
                        getCompare(operator, 1);
                        break;
                    case '-' :
                        getCompare(operator, 1);
                        break;
                    case '*' :
                        getCompare(operator, 2);
                        break;
                    case '/' :
                        getCompare(operator, 2);
                        break;
                    case '^' :
                        getCompare(operator, 3);
                        break;
                    case 'g' :
                        getCompare(operator, 4);
                        break;
                    case '(' :
                        System.out.println("(5-1) 如果是左括号“(”,则直接压入S1");
                        signStack.push(String.valueOf(Infix.charAt(index)));
                        break;
                    case ')' :
                        //则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃
                        System.out.println("(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃");
                        while (!signStack.peek().equals("(")) {
                            middleResultStack.push(signStack.pop());
                        }
                        System.out.println("弹出左右括号");
                        signStack.pop();
                        break;
                    default :
                        System.out.println("奇怪" + String.valueOf(Infix.charAt(index)));
                        //middleResultStack.push(String.valueOf(Infix.charAt(index)));
                        break;
                    }
                }
            }
        }
        System.out.println("(7) 将S1中剩余的运算符依次弹出并压入S2   S1 : " + signStack);
        while (!signStack.isEmpty()) {
            System.out.println("最后依次弹出S1中的符号    " + signStack.peek());
            middleResultStack.push(signStack.pop());
        }
 
        return middleResultStack;
    }
 
    public static void getCompare(char ch, int prec1) {
        while (!signStack.isEmpty()) {
            String oper = signStack.peek();
            int prec2 = -1;
            if (oper.equals("+") || oper.equals("-")) {
                prec2 = 1;
            }else if (oper.equals("*") || oper.equals("/")) {
                prec2 = 2;
            } else if (oper.equals("^")) {
                prec2 = 3;
            } else if (oper.equals("g")) {
                prec2 = 4;
            }
            //若优先级比栈顶运算符的高,也将运算符压入S1
            if (prec1 > prec2 || oper.equals("(")) {
                System.out.println("(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况)   " + String.valueOf(ch));
                signStack.push(String.valueOf(ch));
                break;
            } else {
                //将S1栈顶的运算符弹出并压入到S2中,与S1中新的栈顶运算符相比较
                System.out.println("(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较1  "  + signStack.peek());
                while (!signStack.isEmpty()) {
                    middleResultStack.push(signStack.pop());
 
                    if (!signStack.isEmpty()) {
                        int prec3 = -1;
                        if (signStack.peek().equals("+") || signStack.peek().equals("-")) {
                            prec3 = 1;
                        } else if (signStack.peek().equals("*") || signStack.peek().equals("/")) {
                            prec3 = 2;
                        } else if (signStack.peek().equals("^")) {
                            prec3 = 3;
                        } else if (signStack.peek().equals("g")) {
                            prec3 = 4;
                        }
 
                        if (prec1 > prec3 || signStack.isEmpty() || signStack.peek().equals("(")) {
                            System.out.println("(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1   " + String.valueOf(ch));
                            signStack.push(String.valueOf(ch));
                            break;
                        } else {
                            System.out.println("(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较2   " + signStack.peek());
                            middleResultStack.push(signStack.pop());
                            if (signStack.isEmpty() || signStack.peek().equals("(")) {
                                System.out.println("(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈2  " + String.valueOf(ch));
                                signStack.push(String.valueOf(ch));
                                break;
                            }
                        }
                    } else {
                        signStack.push(String.valueOf(ch));
                        break;
                    }
                }
                break;
            }
        }
    }
 
    public static void main(String[] args) {
        //A*D^B*(E+F*D+G*gD)^C
        //A*D^B*((E+F*E^(G*D))^H)^C
        //A*D^B*(E+F*D+G*gD)^C
        Stack<String> a = getExpression("A+B+C");
 
        Stack<String> b = new Stack<String>();      
        while (!a.isEmpty()) {
            b.push(a.pop());
        }
        String h = "";
        while (!b.isEmpty()) {
            h += b.pop();
        }
        System.out.println("(8)依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)");
        System.out.println(h);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值