中缀表达式转后缀表达式

package day8;



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

public class expression {
    public static void main(String[] args) {
        String expression = "1+((2+3)*4)-5";
        List<String> res = ToArrayList(expression);
        System.out.println(res);
        System.out.println("将中缀表达式转换为后缀");
        List<String> houzhuilist = houzhuilist(res);
        System.out.println(houzhuilist);

    }




//----------------------------将中缀表达式字符串转换为ArrayList---------------------------------
    public static List<String> ToArrayList(String s){
//思路:首先要遍历字符串(i),如果是字符直接加入list。如果是数字(多位数)要先拼接(str="")然后加入list
//   最后返回list
        int i =0;  //遍历
        ArrayList<String> list = new ArrayList<>();  //创建数组存放转换后的字符串
        String Str="";
        char c;
            while (i<s.length()){      //s=1+((2+3)*4)-5
//                判断为非数字
                if (s.charAt(i)<48 ||s.charAt(i)>57){  //或   48-57----->0-9
                    list.add(s.charAt(i)+""); //s.charat为char,加入“”就转换为了字符串
                    i++;     //向后移
                }
                else {
//                    c为数字
                    Str=""; //置为空
                    if (s.charAt(i)>48&&s.charAt(i)<57){
                        Str+=s.charAt(i);   //将数字拼接
                        i++;     //后移
                    }
                    list.add(Str);
                }


            }
        return list;
    }
//-------------------------------------将中缀表达式list转换成后缀表达式的list--------------------
public  static List<String> houzhuilist(List<String> ls){
//        定义两个栈
    Stack<String> stack1 = new Stack<String>();  //符号栈
//    说明:stack2在转换过程中没有pop,所以用数组代替 Arraylist
//    Stack<String> stack2 = new Stack<String>();   //存放中间结果的栈
    ArrayList<String> list2 = new ArrayList<>();
//    遍历ls
    for (String item:ls){
//        如果是一个数就加入string
        if (item.matches("\\d+")){
            list2.add(item);

        }else if (item.equals("(")){
            stack1.push("(");
        }else if (item.equals(")")){
            while (!stack1.peek().equals("(")){
                list2.add(stack1.pop());
            }
            stack1.pop();//将这个小括号弹出
        }else {
//         判断栈顶的运算符的优先级大于等于item(从字符串取出的运算符)的优先级
            while (stack1.size()!=0 && operation.getvalue(stack1.peek()) >=operation.getvalue(item)){
                list2.add(stack1.pop());
            }
//           还需要将item压入栈中
            stack1.push(item);
        }
    }
    while (stack1.size()!=0){
        list2.add(stack1.pop());
    }
    return list2;

}
}


    class operation {
        private static int ADD = 1;
        private static int SUB = 1;
        private static int MUL = 2;
        private static int DIV = 2;


        //    写一个方法,返回优先级的数字
        public static int getvalue(String oper) {
            int result = 0;
            switch (oper) {
                case "+":
                    result = 1;
                    break;
                case "-":
                    result = 1;
                    break;
                case "*":
                    result = 2;
                    break;
                case "/":
                    result = 2;
                    break;
                default:
                    System.out.println("不存在改运算符");
                    break;
            }
            return result;
        }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值