中缀表达式转后缀表达式

中缀表达式, 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法

后缀表达式(逆波兰式),指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行.

中缀表达式转后缀表达式选择题做法:

这里写图片描述

代码实现:

/**
 * 中缀表达式转换为后缀表达式
 * 
 * 
 * 规则:
 * 相同等级的栈内高于栈外
 * 栈外左括号优先级最高
 * 栈内左括号优先级最低
 * 栈外右括号优先级最低,和栈内左括号优先级一样低


 * */



class Constant {//先定义各种运算的优先级。数字越小,说明优先级越高


    public static final int OPERATORS_PRIO_PLUS_IN = 4;  //栈内加法
    public static final int OPERATORS_PRIO_SUB_IN  =  4;   //栈内减法
    public static final int  OPERATORS_PRIO_MULTY_IN  =  2; //栈内乘法
    public static final int OPERATORS_PRIO_DIV_IN  =  2 ;  //栈内除法
    public static final int OPERATORS_PRIO_LEFT_BRAK_IN  =  10;  //栈内左括号

    public static final int OPERATORS_PRIO_PLUS_OUT  =  5 ; //栈外加法
    public static final int OPERATORS_PRIO_SUB_OUT  =   5;   //栈外减法
    public static final int OPERATORS_PRIO_MULTY_OUT  =  3; //栈外乘法
    public static final int OPERATORS_PRIO_DIV_OUT  =  3;   //栈外除法
    public static final int OPERATORS_PRIO_LEFT_BRAK_OUT =  1;  //栈外左括号
    public static final int OPERATORS_PRIO_RIGHT_BRAK_OUT =  10;  //栈外右括号
    public static final int OPERATORS_PRIO_ERROR = -1;


}




public class test {


    //获取优先级

    public static int Get_Prio(char opera,boolean instack)
    {
        int prio = Constant.OPERATORS_PRIO_ERROR;
        if(instack)
        {
            switch(opera)
            {
            case '+':
                prio = Constant.OPERATORS_PRIO_PLUS_IN;
                break;
            case '-':
                prio = Constant.OPERATORS_PRIO_SUB_IN;
                break;
            case '*':
                prio = Constant.OPERATORS_PRIO_MULTY_IN;
                break;
            case '/':
                prio = Constant.OPERATORS_PRIO_DIV_IN;
                break;
            case '(':
                prio = Constant.OPERATORS_PRIO_LEFT_BRAK_IN;
                break;
            default:
                prio = Constant.OPERATORS_PRIO_ERROR;
                break;
            }
        }
        else
        {
            switch(opera)
            {
            case '+':
                prio = Constant.OPERATORS_PRIO_PLUS_OUT;
                break;
            case '-':
                prio = Constant.OPERATORS_PRIO_SUB_OUT;
                break;
            case '*':
                prio = Constant.OPERATORS_PRIO_MULTY_OUT;
                break;
            case '/':
                prio = Constant.OPERATORS_PRIO_DIV_OUT;
                break;
            case '(':
                prio = Constant.OPERATORS_PRIO_LEFT_BRAK_OUT;
                break;
            case ')':
                prio = Constant.OPERATORS_PRIO_RIGHT_BRAK_OUT;
                break;
            default:
                prio = Constant.OPERATORS_PRIO_ERROR;
                break;
            }
        }
        return prio;
    }
    public static void getprio(){}




    public static void strmidtolast(String strmid,char[]strlast){
        char[]stack=new char[strmid.length()];
        int top=0;
        int len=strmid.length();
        int i=0;//计数
        int j=0;//用来表示strlast的下标
        int prioin;//表示栈内优先级
        int prioout;//表示栈外优先级
        while(i!=len){
        //判断当前的字符是不是数字
            if(Character.isDigit(strmid.charAt(i))){
                strlast[j]=strmid.charAt(i);//如果是数字,则直接把当前字符放入strlast
                j++;
                i++;

            }else{//如果不是数字
                if(top==0){//此时栈为空
                    stack[top++]=strmid.charAt(i);//直接入栈
                    i++;
                }
                else{//栈不为空,得先比较优先级
                    prioin=Get_Prio(stack[top-1],true);//先得到优先级
                    prioout=Get_Prio(strmid.charAt(i),false);
                //栈内优先级高于栈外
                if(prioin<prioout){
                    strlast[j++]=stack[--top];//直接把栈内的元素给strlast
                }
                else if(prioin==prioout){//如果俩个优先级相同,则说明遇到了括号,只需要把括号放在一边不管即可
                top--;
                i++;

                }else{//栈内优先级低于栈外

                    stack[top++]=strmid.charAt(i);//直接让元素入栈
                    i++;
                }


                }


                }
            }//判断栈内是否还有运算符
        while(top>0){//如果栈内还有运算符,直接把运算符按顺序赋给strlast
            strlast[j++]=stack[top--];


        }


        }
    //打印数组
    public  static void show(char[]strlast ){
        for (int i=0;i<strlast.length;i++){
            System.out.print(strlast[i]+" ");
        }

    }



    public static void main(String[] args) {
        String strmid="2+3*5-4*(5-3)";
        char[]strlast= new char [strmid.length()];
        strmidtolast( strmid,strlast);
        show(strlast);


    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值