中缀表达式转后缀表达式java实现

输入一个字符串计算式子,输出其中缀表达式。

先将计算式子转换为list

public static List<String> infexList(String s){
        int index = 0;
        String str;
        final List<String> strings = new ArrayList<>();
        while(index<s.length()){
            //字符0代表48,9代表57

            //代表a是非数字
            if(s.charAt(index)<48||s.charAt(index)>57){
                str = "";
                str = str + s.charAt(index);
                strings.add(str);
                index++;
            }else {
                str = "";
                //当符合这个条件的时候还要对下一个字符进行判断,注意第一个字符是符合的,当不是数字的时候才跳出。
                while(index<s.length()&& (s.charAt(index)>=48&&s.charAt(index)<=57)){
                    str = str + s.charAt(index);
                    index++;
                }
                strings.add(str);
            }
        }

        return strings;
    }

当判断到数字的时候,在while语句中要把当前的index在进行判断,不可以对index++判断,这样如果不是数字的话,就回不去了。对index进行判断,当它不是数字的时候,还可以回到主while中进行再次判断。

将中缀表达式变成后缀表达式

思路分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200331200545139.png因为s2没有pop而且要逆序输出,故list来代替合适。

写一个方法来测试符号优先级

/**
     * 写一个方法进行判断符号的优先级
     * return 1 代表list取出来的符号优先级高
     * @param string1 s1栈顶的符号
     * @param string2 list取出来的符号
     * @return
     */
    public static boolean isJudge(String string1,String string2){
        int a ;
        int b ;
        if(string1.equals("+")||string1.equals("-")){
            a = 0;
        } else if (string1.equals("*") || string1.equals("/")) {
            a = 1;
        }else{
            a = 0;
        }
        if (string2.equals("*")  || string2.equals("/") ) {
            b = 1;
        }else if (string2.equals("+") || string2.equals("-")) {
            b = 0;
        }else {
            b = 0;
        }
        if(b - a > 0){
            return true;
        }else if(string1.equals("(")){
            return true;
        }
        else{
            return false;
        }
        }

如果返回true则代表list取出数据优先级高,否则栈中优先级高。

综合代码

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * FileName: InfexToSuffix
 *
 * @Author:luguobao Date: //19:08
 * Description:将中缀表达式变后缀表达式
 * History:
 * <author>   <time>   <version>   <desc>
 * 作者姓名    修改时间    版本号       描述
 */
public class InfexToSuffix {
    public static void main(String[] args) {
        String s = "1+(5+2*3)-1+2/(3+5)";
        final List<String> strings = infexList(s);
        infexTosuffix(strings);
        System.out.println(isJudge("+","*"));
    }

    /**
     *将字符串变成list
     * @param s
     * @return
     */
    public static List<String> infexList(String s){
        int index = 0;
        String str;
        final List<String> strings = new ArrayList<>();
        while(index<s.length()){
            //字符0代表48,9代表57

            //代表a是非数字
            if(s.charAt(index)<48||s.charAt(index)>57){
                str = "";
                str = str + s.charAt(index);
                strings.add(str);
                index++;
            }else {
                str = "";
                //当符合这个条件的时候还要对下一个字符进行判断,注意第一个字符是符合的,当不是数字的时候才跳出。
                while(index<s.length()&& (s.charAt(index)>=48&&s.charAt(index)<=57)){
                    str = str + s.charAt(index);
                    index++;
                }
                strings.add(str);
            }
        }

        return strings;
    }

    /**
     * 将前缀表达式变成后缀表达式
     */
    public static List<String> infexTosuffix(List<String> list){
        //s1用来存符号,s2用来存数字
        final Stack<String> s1 = new Stack();
        final ArrayList<String> s2 = new ArrayList<>();
        int index = 0;
        for (String str:
             list) {
            //用正则表达式来匹配数字“+”可以匹配到多个数字
            if(str.matches("\\d+")){
                s2.add(str);
            }else {
                //如果是字符的话则进行判断
                if (str.equals("(")){
                    s1.push(str);
                }else if(s1.isEmpty()){
                    s1.push(str);
                }else if(str.equals(")")){
                    //在取到“(”之前将里面的符号取出来,注意如果栈中没有数据是不能peek的
                    while(!s1.isEmpty()&&!s1.peek().equals("(")){
                        s2.add(s1.pop());
                    }
                    //将“(”弹出
                    s1.pop();
                    //当字符是乘或者除的时候
                }
                //需要写一个方法来判断符号的优先级,如果list元素的优先级高,直接压栈
                else if(isJudge(s1.peek(),str)){
                    s1.push(str);
                    //如果list优先级低或者相等,则将s1栈顶元素取出来,然后再进行比较
                }else{
                    while(!s1.isEmpty()&&!isJudge(s1.peek(),str)){
                        s2.add(s1.pop());
                    }
                    s1.push(str);

                }
            }
        }
        //再将s1中的元素压倒s2上
        while(!s1.isEmpty()){
            s2.add(s1.pop());
        }
        System.out.println(s2);

        return s2;
    }

    /**
     * 写一个方法进行判断符号的优先级
     * return 1 代表list取出来的符号优先级高
     * @param string1 s1栈顶的符号
     * @param string2 list取出来的符号
     * @return
     */
    public static boolean isJudge(String string1,String string2){
        int a ;
        int b ;
        if(string1.equals("+")||string1.equals("-")){
            a = 0;
        } else if (string1.equals("*") || string1.equals("/")) {
            a = 1;
        }else{
            a = 0;
        }
        if (string2.equals("*")  || string2.equals("/") ) {
            b = 1;
        }else if (string2.equals("+") || string2.equals("-")) {
            b = 0;
        }else {
            b = 0;
        }
        if(b - a > 0){
            return true;
        }else if(string1.equals("(")){
            return true;
        }
        else{
            return false;
        }
        }
    }


测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值