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

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个实验的目的是将一般算术表达式转换成后缀式。后缀式也叫逆波兰式,是一种不含括号的表达式,运算符在操作数的后面,因此也叫后缀表达式。转换后的后缀式可以方便地进行计算,而且不需要考虑运算符的优先级和括号的问题。 转换算法的基本思路是利用栈来存储运算符,遇到操作数直接输出,遇到运算符则将其与栈顶运算符比较优先级,如果栈顶运算符优先级高,则将栈顶运算符弹出并输出,直到栈顶运算符优先级低于当前运算符或者栈为空,然后将当前运算符入栈。最后将栈中剩余的运算符依次弹出并输出。 例如,将中缀表达式"3+4*5-6"转换成后缀表达式的过程如下: 1. 从左到右扫描中缀表达式,遇到操作数直接输出,即输出3; 2. 遇到运算符"+",将其入栈; 3. 遇到操作数4,直接输出,即输出4; 4. 遇到运算符"*",由于"*"的优先级高于"+",所以将其入栈; 5. 遇到操作数5,直接输出,即输出5; 6. 此时栈顶为"*",优先级高于"+",所以将"*"弹出并输出,即输出4 5 *; 7. 遇到运算符"-",由于"-"的优先级低于"*",所以将"-"入栈; 8. 遇到操作数6,直接输出,即输出6; 9. 此时栈顶为"-",优先级低于"*",所以将6入栈; 10. 扫描结束,将栈中剩余的运算符依次弹出并输出,即输出3 4 5 * + 6 -。 最终得到的后缀表达式为"3 4 5 * + 6 -"。 ### 回答2: 一般算术表达式是指包含加、减、乘、除等运算符及其优先级,以及括号的表达式。在计算机中,我们需要将这种表达式转换成后缀式,以方便计算机的处理。后缀式也叫逆波兰式,是一种把运算符后置的表达式,例如将中缀表达式“9+5*3-8/4”转换为后缀表达式为“9 5 3 * + 8 4 / -”。 算法思想: 我们可以借助栈来实现中缀表达式后缀表达式,具体来说,我们需要先遍历一遍中缀表达式,然后按照优先级将操作符加入栈中,将数字直接输出。遍历完成之后,将栈中所有操作符按照顺序依次输出,这时候得到的序列就是后缀表达式。 具体实现: 1. 遍历中缀表达式,对于数字直接输出。 2. 对于遇到的操作符,如果是左括号,直接入栈;如果是右括号,则将栈中的操作符出栈,直到遇到左括号停止,并将左右括号丢弃;如果是其他操作符,则需要将栈中比当前操作符优先级更高的操作符全部出栈,放到后缀表达式中,然后将当前操作符入栈。 3. 遍历完成后,将栈中操作符全部出栈并添加到后缀表达式中。 4. 最后得到的序列就是后缀表达式。 代码实现: ```python def infixToPostfix(expression): operators = {'+': 1, '-': 1, '*': 2, '/': 2, '(': 0, ')': 0} # 操作符优先级 stack = [] postfix = [] for ch in expression: if ch.isdigit(): # 直接输出数字 postfix.append(ch) else: if ch == '(': stack.append(ch) elif ch == ')': while stack and stack[-1] != '(': postfix.append(stack.pop()) if stack and stack[-1] == '(': stack.pop() else: while stack and operators[ch] <= operators[stack[-1]]: postfix.append(stack.pop()) stack.append(ch) while stack: postfix.append(stack.pop()) return postfix ``` 总结: 通过栈的使用,我们可以很方便地将一般算术表达式转换成后缀式,并且复杂度为O(n),非常高效。实际应用中,后缀表达式可以直接计算,比中缀表达式更便于计算。因此,这种算法也有很广泛的应用场景。 ### 回答3: 在编程领域中,算术表达式的转换是一项非常重要的任务。而在数据结构实验中,我们学习到了如何将一般算术表达式转换成后缀式。下面,我将从以下几个方面进行阐述。 一、算法思路 将一般算术表达式转换成后缀式的算法思路是将符号按照操作优先级依次入栈和出栈,这个过程需要遵守以下几个规则: 1、如果是操作数,直接输出 2、如果是左括号,入栈 3、如果是右括号,弹出栈中所有运算符,并将它们输出,直到遇到左括号为止,但是左括号不输出 4、如果是运算符,弹出所有优先级大于或等于该运算符的栈顶运算符,然后将该运算符入栈 5、最后,将栈中的所有运算符依次弹出并输出,不包括左括号 二、具体实现 在具体实现上,我们需要创建两个栈,一个用于存储运算符,一个用于输出后缀式,然后遍历算术表达式,根据上述算法思路将符号依次入栈和出栈即可。具体代码实现如下: void transform(char exp[], char postfix[]) { char ch, elem; int i = 0, k = 0; Stack<char> s; while ((ch = exp[i++]) != '\0') { if (ch == '(') s.push(ch); else if (isdigit(ch) || isalpha(ch)) { postfix[k++] = ch; } else if (ch == ')') { while ((elem = s.pop()) != '(') { postfix[k++] = elem; } } else { while (!s.isEmpty() && priority(s.peek()) >= priority(ch)) { postfix[k++] = s.pop(); } s.push(ch); } } while (!s.isEmpty()) { postfix[k++] = s.pop(); } postfix[k] = '\0'; } int priority(char ch) { if (ch == '(') return 0; if (ch == '+' || ch == '-') return 1; if (ch == '*' || ch == '/') return 2; return 3; } 三、算法的应用 将一般算术表达式转换成后缀式在编程中有着广泛的应用,例如表达式求值、编译器中的语法分析等。 最后,要注意的是,在转换过程中,应当考虑数据类型及精度等问题,并严格按照算法思路进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值