如何将中缀表达式变成后缀表达式java

这里只考虑+-*  /()六种符号。

具体实现方法:

首先准备一个StringBuffer用来记录结果,一个栈用来装符号,然后从头扫描中缀表达式。

1.如果是数字直接加入StringBuffer

2.如果是+-号,把栈中的元素一个一个弹栈并加到StringBuffer,直到遇到括号或者空栈。然后入栈。

3.如果是*/号,从栈中一个一个扫描如果是*/号则弹栈并加到StringBuffer,否则入栈。

4.如果是左括号,直接入栈。

5.如果是右括号,把左括号之前的栈中符号全部加到StringBuffer末尾。

扫描完之后把栈中剩余的符号全部加入StringBuffer末尾。

over

一些自己的思考:

1.中缀表达式和后缀表达式的本质区别在于运算时运算符号是不是从前往后执行的。因此把中缀表达式变成后缀表达式的关键就在于找到运算符号执行的顺序。

2.括号在某种意义上讲相当于从新开了一个表达式,先把括号当作一个数来对待,然后括号里的表达式转换好再加到外面的表达式里面。这样所有的表达式相当与没有括号。我们只需要考虑如何转换不同优先级的符号之间的顺序。

3.符号的运算顺序就两个规律,一是优先级高的先算,二是优先级相同的先左后右。

4.因此在这种规律下就可以设计一种思路找到这种转换方法(适用于不止两种优先级别而且多种优先级别)。用栈从左到右储存符号,每个符号入栈时把栈顶若干比他优先级高(或相等)的元素弹出到表达式中。这样就完成了转换。

自己写的破代码、、

package chapter1_3;

import java.util.Stack;

//中缀表达式变成后缀表达式
public class ex1_3_10 {
    public static String INfixtoPostfix(String s){
        char[] arr=s.toCharArray();
       // Stack<Character> numStack=new Stack();
        Stack<Character> operatorStack=new Stack();
        StringBuffer sb=new StringBuffer();

        for(char c:arr){
            switch(c){
                case '+':
                case '-':
                    if(operatorStack.isEmpty()||operatorStack.peek()=='('){
                        operatorStack.push(c);
                        break;
                    }else{
                        while(!operatorStack.isEmpty()){
                           if(operatorStack.peek()!='('){
                               sb.append(operatorStack.pop());
                           }else {
                               operatorStack.push(c);
                               break;
                           }
                        }
                    }
                    if(operatorStack.isEmpty()){
                        operatorStack.push(c);
                    }
                    break;
                case '*':
                case '/':
                    if(operatorStack.isEmpty()||operatorStack.peek()=='('){
                        operatorStack.push(c);
                        break;
                    }else{
                        while(!operatorStack.isEmpty()){
                            if(operatorStack.peek()!='('){
                                if(operatorStack.peek()=='*'||operatorStack.peek()=='/'){
                                    sb.append(operatorStack.pop());
                                }else{
                                    operatorStack.push(c);
                                    break;
                                }
                            }else {
                                operatorStack.push(c);
                                break;
                            }
                        }
                    }
                    if(operatorStack.isEmpty()){
                        operatorStack.push(c);
                    }

                    break;
                case '(':
                    operatorStack.push(c);
                    break;
                case ')':
                    while(operatorStack.peek()!='('){
                        sb.append(operatorStack.pop());
                    }
                    operatorStack.pop();
                    break;
                default:
                    sb.append(c);
            }
        }
        while(!operatorStack.isEmpty()){
            sb.append(operatorStack.pop());
        }
        return new String(sb);

    }
    public static void main(String[] args) {
        String ans=INfixtoPostfix("9 + ( 3 - 1 ) * 3 + 10 / 2");
        System.out.println(ans);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值