中缀表达式转后缀表达式与计算

该博客详细介绍了如何将中缀表达式转换为后缀表达式,并提供了具体的实现步骤和代码示例。同时,还包含了计算后缀表达式的算法,通过使用栈数据结构来处理运算符的优先级。整个过程包括了符号栈和后缀表达式栈的管理,以及处理括号和不同运算符的逻辑。
摘要由CSDN通过智能技术生成

中缀表达式转后缀表达式与计算

1.创建两个栈,一个存储数字和后缀表达式s1,一个存储符号栈s2
2.存储流程
(1)如果符号栈s2为空,直接存入符号。
(2)如果不为空,当前符号优先级等于或者大于栈的符号,直接存入。
(3)如果不为空,当前符号优先级雄小于栈的符号,先弹出一个符号栈顶的元素,再比较,然后再存入
(4)如果遇到(直接存入。
(5)如果遇到)把符号栈遇到(之前的符号全部弹出存进去s1,最后再弹出这个括号。

具体实现如下:

//将中缀表达式转换为后缀表达式
    public static List<String>parseSuffixExpreesionList(List<String> ls){


        Stack<String> s1=new Stack<>();//符号栈

        List<String> s2=new ArrayList<>(); //后缀表达式栈

        for (String item:ls)
        {
            //判断是否为数字
            if (item.matches("\\d+"))
            {
                s2.add(item);
            }else if (item.equals("(")) //是否为左括号
            {
                s1.add(item);
            }else if (item.equals(")")) //是否为右括号
            {
                //取出遇到做括号之前的所右运算符存进s2
                while (!s1.peek().equals("("))
                {
                    s2.add(s1.pop());
                }
                s1.pop();
            }
            else{
                while(s1.size()!=0&&operation.getOp(s1.peek())>=operation.getOp(item))
                {
                        s2.add(s1.pop());
                }
                //把运算符存进去
                s1.add(item);



            }
        }
        //把剩下的符号存进去
        while (s1.size()!=0)
        {
            s2.add(s1.pop());
        }

        return s2;
    }

      //把字符串准换为list集合
    public static List<String>toInfixExpressionList(String s)
    {
        //创建一个集合
        List<String> list=new ArrayList<>();
        char c;
        String str;
        int  i=0;

        do{
            //不是数字
            if ((c=s.charAt(i))<48||(c=s.charAt(i))>57)
            {
                //直接存入
                list.add(c+"");
                i++;
            }

            else{
                str="";
                //数字
                while(i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57)

                {
                    //拼接数字
                   str+=c;
                   i++;
                }
                list.add(str);
            }

        }while (i<s.length());

        return list;
    }


    //计算逆波兰表达式
    public static int ca(List<String> list)
    {
        //定义一个集合存储数据
        Stack<String> stack=new Stack<>();
        //遍历集合
        for (String item:list)
        {
            //判断是否为数字,是放进去
            if (item.matches("\\d+")){
                stack.push(item);
                //否则丛stack弹出两个数据进行运算
            }else
            {
                //第二个数据
                int num2=Integer.parseInt(stack.pop());
                //第一个数
                int num1=Integer.parseInt(stack.pop());
                int res=0;
                switch (item){
                    case "+":
                        res=num1+num2;
                        break;
                    case "-":res=num1-num2;
                        break;
                    case "*":res=num1*num2;
                        break;
                    case "/": res=num1/num2;
                        break;
                    default:
                        System.out.println("有误/为括号");;
                }
                //最后的后果
                stack.push(res+"");
            }
        }
        return Integer.parseInt(stack.pop());
    }

//操作符优先级
public class operation {

    private static int add=1;
    private static int jian=1;
    private static int mul=2;
    private static int div=2;


    public  static int getOp(String op)
    {

        int result=0;
        switch (op){
            case "+":
                result= add;
            break;
            case "-": result= jian;
            break;
            case "*":result= mul;
            break;
            case "/":result= div;
            default:
                System.out.println("操作符有误/为括号");
        }

        return result;
    }
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值