Java中缀转后缀表达式

来源:互联网 发布:淘宝买家皇冠号多少钱 编辑:程序博客网 时间:2024/05/17 08:56

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;    }}
原创粉丝点击