zoukankan      html  css  js  c++  java
  • 中缀表达式转后缀表达式的简单实现

    分析步骤:

    实现代码:

    package com.cai.learn.math;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    
    /**
     * 目标中缀表达式转成后缀表达式
     */
    public class InfixToSuffixTest {
        public static void main(String[] args) {
            //表达式 1 + ( ( 2 * 3) - 5 ) + 8
            String infix = "1 + ( ( 2 * 3 ) - 5 ) + 8";  //-->[1, 2, 3, *, 5, -, +, 8] 1 2 3 * 5 - + 8 +   =10
            Stack<String> stackOperate = new Stack<String>(); //符号栈
            List<String> list = new ArrayList<String>(); //相当于中间存储
            String[] arr = infix.split(" ");
            for (int i = 0; i < arr.length; i++) {
                String str = arr[i];
                if(str.matches("\d+")){
                    list.add(str);
                }else{
                    if(stackOperate.empty()||"(".equals(str)){
                        stackOperate.push(str);
                    }else if(")".equals(str)){
                        while(!"(".equals(stackOperate.peek())){
                            list.add(stackOperate.pop());
                        }
                        stackOperate.pop();
                    }else if(Priority.getPriority(str)>Priority.getPriority(stackOperate.peek())){
                        stackOperate.push(str);
                    }else{
                        while(true){
                            if(stackOperate.empty())break;
                            String thisOperate = stackOperate.peek();
                            if("(".equals(thisOperate))break;
                            if(Priority.getPriority(str)>Priority.getPriority(thisOperate))break;
                            list.add(stackOperate.pop());
                        }
                        stackOperate.push(str);
                    }
                }
            }
            while (!stackOperate.empty()){
                list.add(stackOperate.pop());
            }
            System.out.println(list);
        }
    }
    class Priority{
        private static final int ADD = 1;
        private static final int SUB = 1;
        private static final int MUL = 2;
        private static final int DIV = 2;
    
        public static int getPriority(String operate){
            if("+".equals(operate)) return ADD;
            else if("-".equals(operate)) return SUB;
            else if("*".equals(operate)) return MUL;
            else if("/".equals(operate)) return DIV;
            else return 0;
        }
    }
  • 相关阅读:
    Facade
    Adapter
    Bridge
    Factory
    Singleton
    Decorator
    Template Method
    设计模式
    寻找最小的k个数
    java并发编程(4)--线程池的使用
  • 原文地址:https://www.cnblogs.com/cai170221/p/13695521.html
Copyright © 2011-2022 走看看