Java中缀转后缀表达式

Java中缀转后缀表达式
看了网上其他人写的感觉好复杂,难以理解,我感觉我的实现很简单,容易明白,可以借鉴!哈哈
注释很全,不解释了

public class Demo {

    @Test
    public void main(){
        String hou = zhongTransHou("2+((1-3)*4)-2");
        System.out.println(hou);
    }
    public String zhongTransHou(String zhong){

        //创建一个栈存放运算符使用
        Stack<Character> ysfz = new Stack<Character>();
        StringBuilder hz = new StringBuilder();

        //扫描整个运算表达式
        char[] chars = zhong.toCharArray();

        for (char c : chars) {
            //当前扫描的是运算符
            if(c == '+' || c== '-' || c== '*' || c=='/'||c==')'||c=='('){
                //进行优先级和右括号的判断
                //如果当前元素是右括号的话
                if(c == ')'){
                    while(ysfz.peek()!='('){//遍历部分栈,只要栈顶不是"("都要出战,并且匹配到"("本身也要出栈
                        char top = ysfz.pop();//移除栈顶元素并返回移除的值
                        hz.append(top);
                    }
                    //执行到这里说明已经清空了所有的在"("上面的运算符,此后将本身也给清楚
                    ysfz.pop();
                }else if(ysfz.isEmpty()){//当前栈是空的话
                    ysfz.push(c);//直接入栈
                }else if(curYSFIsGao(c,ysfz)){//当前运算符比栈顶运算符高的话
                    ysfz.add(c);
                }else if(!curYSFIsGao(c,ysfz)){//当前运算符比栈顶运算符低的话
                    while(!ysfz.isEmpty()){//遍历整个栈
                        char top = ysfz.pop();
                        hz.append(top);
                    }
                    //执行到这里栈已经是空了,现在将当前元素入栈
                    ysfz.push(c);
                }
            }else{//当前扫描的数字
                hz.append(c);
            }
        }
        //真个表达式扫描之后,出栈
        while(!ysfz.isEmpty()){
            char top = ysfz.pop();
            hz.append(top);     
        }
        return hz.toString();

    }

    /**
     * 判断当前元素和栈顶元素的优先级,这里面间接的判断如果是“(”也是入栈(优先级高就入栈)
     * @param c
     * @param ysfz
     * @return
     */
    private boolean curYSFIsGao(char c,Stack<Character> ysfz) {
        boolean isGao = true;//默认是高
        //拿取栈顶元素,和当前传入元素做比较优先级
        char top = ysfz.peek();
        if(c == '+' || c == '-'){
            if(top == '*' || top == '/'){
                isGao = false;
            }
            //遇到加减或者"("默认高
        }
        //当前是乘除的话默认高,也就是都向栈里面添加
        return isGao;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值