java 逆波兰表达式计算 简单版

字符串->中缀表达式转->后缀表达式->逆波兰表达式的计算

public class MM{
   public static void main(String[] args){
        String str="3 4 + 5 * 6 - ";
        getList(str);
        List<String> rpnList=getList(str);
        System.out.println(calculate(rpnList));
        String str1="1+200*3-4";
        System.out.println(toInfixExpressionList(str1));
        System.out.println("-----------------------------------");
       List<String> li=toHouZhuiExpression(toInfixExpressionList(str1));

       System.out.println(calculate(li));

    }
    public static List<String> getList(String str){
        String[] arr=str.split(" ");
        List<String> list=new ArrayList<> ();
        for(String i:arr){
            list.add(i);
        }
        return list;
    }
    public static int calculate(List<String> ls){
        //创建一个栈
        Stack<String> stack=new Stack<> ();
        //创建 ls
        for(String item:ls) {
            if (item.matches("\\d+"))
            {
                //入栈
                stack.push(item);
            }else{
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                int res = 0;
                if (item.equals("+")){
                    res=num1+num2;
                }
                else if(item.equals("-")){
                    res=num1-num2;
                } else if(item.equals("*")){
                    res=num1*num2;
                } else if(item.equals("/")){
                    res=num1/num2;
                }else {
                    throw new RuntimeException("运算符有误");
                }
                stack.push(""+res);
            }
        }
        return Integer.parseInt(stack.pop());
    }
//    public static List<String> change(List<String> str){
//       List<String> list=new ArrayList<> ();
//        Stack<String> list1=new Stack<> ();
//       for()
//    }
    public static List<String> toInfixExpressionList(String s){
       List<String> ls=new ArrayList();
       int i=0;
       String str;
       char c;
       do {
           if((c=s.charAt(i))<48||(c=s.charAt(i))>57){
               ls.add(""+c);
               i++;
           }else
           {
               str="";
               while (i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57){
                    str+=c;
                    i++;
               }
               ls.add(str);
           }
       }while (i<s.length());
           return ls;
    }
    public static List<String> toHouZhuiExpression(List<String> list){
       Stack<String> sta=new Stack();
       List<String> ls=new ArrayList();
       for(String item:list){
           if(item.matches("\\d+")){
               ls.add(item);
           }else{
               if(item.equals("(")){
                   sta.push(item);
               }else if(item.equals(")")){
                   while (!sta.equals("(")){
                       ls.add(sta.pop());
                   }
                   sta.pop();
               }else{
                   while (sta.size()!=0&&Operation.getValue(sta.peek())>=Operation.getValue(item)){
                       ls.add(sta.pop());
                   }
                   sta.push(item);
               }
           }
       }
           while (sta.size()!=0){
               ls.add(sta.pop());
           }
           return ls;
    }
}
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){
        switch (oper){
            case "+":
                return ADD;
            case "-":
                return SUB;
            case "*":
                return MUL;
            case "/":
                return DIV;
            default:
                return 0;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值