算术表达式转成后缀表达式

package datastructure;

public class Postfix {

    /**
     *  转为后缀表达式: 
     * 1、如果是"("直接压入栈。 
     * 2、如果是")",依次从栈弹出运算符加到postfix的末尾,直到遇到"("; 
     * 3、如果是运算符,比较扫描到的运算符,和栈顶的运算符。如果扫描到的运算符优先级
     * 高于栈顶运算符则,把运算符压入栈。否则的话,就依次把栈中运算符弹出加到postfix的末尾,
     * 直到遇到优先级低于扫描到的运算符或栈空,并且把扫描到的运算符压入栈中。就这样依次扫描,知道结束为止。
     * 如果是操作数,直接加到postfix末尾
     * 如果扫描结束,栈中还有元素,则依次弹出加到postfix的末尾。 
     */
    public static void main(String[] args) throws Exception {
        String str="a+(b-c/d)*e";//输出abcd/-e*+则正确
        System.out.println(convertToPostfix(str));
    
    }

public static String convertToPostfix(String str) {
    LinkStack ls= new LinkStack();
    String postfix=new String();
    for(int i=0;i<str.length()&&str!=null;i++){
        char c=str.charAt(i);
        if(c=='(')                 //为开括号
            ls.push(c);
        else if(c==')')             //为闭括号
        {  
            char tmp=(Character) ls.pop();
            while(tmp!='(')
            {
                postfix=postfix.concat(String.valueOf(tmp));
                tmp=(Character) ls.pop();
            }
            
        }
        else if(isOperator(c))       //为运算符
        {
            if(!ls.isEmpty())           //判断栈中存不存在元素
            {
                 char tmp =(Character) ls.pop();
                while(priority(tmp)>=priority(c)){
                    postfix=postfix.concat(String.valueOf(tmp));
                    tmp=(Character) ls.pop();
                }
                if(priority(tmp)<priority(c))
                {
                    ls.push(tmp);
                    ls.push(c);
                }
                
                    
            }
            else                    //空栈直接push
            ls.push(c);
            
                
        }
        else{                        //操作数直接输出到字符串后
            postfix=postfix.concat(String.valueOf(c));
        }
    }
    while(!ls.isEmpty())
        postfix=postfix.concat(String.valueOf(ls.pop()));
    return postfix;
    

}

public static int priority(char c) {
    if(c=='^')
        return 3;
    if(c=='*'||c=='/'||c=='%')
        return 2;
    if(c=='+'||c=='-')
        return 1;
    else
        return 0;
}

public static boolean isOperator(char c) {
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^')
        return true;
    else
        return false;
}


}
转载自:https://www.cnblogs.com/xurui1995/p/5183182.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值