• 中缀表达式转后缀表达式


    58同城1012笔试第二题

    示例1

    输入

    “exp1 & (exp2|exp3)/!exp4”

    输出

    “exp1 exp2 exp3| & exp4 !”

    思路与代码

    这个代码的核心思想是通过栈来处理不同操作符的优先级和括号的嵌套,将中缀表达式转换为后缀表达式,以便更容易进行计算。

    遍历输入的中缀表达式字符串,根据不同情况执行以下操作:
    如果是操作符(如’!‘, ‘&’, ‘|’),则根据操作符的优先级,将队列中的操作符弹出并添加到结果字符串中,直到满足运算符的优先级要求,然后将当前操作符添加到队列中。
    如果是左括号’(‘,直接添加到队列中。
    如果是右括号’)‘,则弹出队列中的操作符并添加到结果字符串,直到遇到左括号’(‘。
    如果是空格字符’ ',跳过。
    否则,将操作数添加到结果字符串中。
    最后,将队列中剩余的操作符依次弹出并添加到结果字符串中。

    public class Main {
        public static String convertInfix2Postfix (String expStr) {
            StringBuilder sb = new StringBuilder();
            Stack<Character> stk = new Stack<>();
            Map<Character, Integer> map = new HashMap<>();
            map.put('!', 5);
            map.put('&', 4);
            map.put('|', 3);
            Set<Character> set = new HashSet<>();
            set.add('!');
            set.add('&');
            set.add('|');
            set.add('(');
            set.add(')');
            int N = expStr.length();
            for(int i=0; i<N; ++i){
                char ch = expStr.charAt(i);
                if(map.containsKey(ch)){
                    while(!stk.isEmpty() && stk.peek()!='('&& map.get(ch) <= map.get(stk.peek()) ){
                        sb.append(stk.pop());
                        sb.append(' ');
                    }
                    stk.push(ch);
                }else if (ch == '('){
                    stk.push(ch);
                }else if (ch == ')'){
                    while(stk.peek()!='('){
                        sb.append(stk.pop());
                        sb.append(' ');
                    }
                    stk.pop();
                }else if (ch == ' '){
                    continue;
                }else {
                   int j = i;
                   while(j<N && !set.contains(expStr.charAt(j))){
                       if(expStr.charAt(j) != ' ')
                           sb.append(expStr.charAt(j));
                       ++j;
                   }
                   sb.append(' ');
                   i = j-1;
                }
            }
            while(!stk.isEmpty()){
               sb.append(stk.pop());
               sb.append(' ');
            }
            sb.deleteCharAt(sb.length()-1);
            return sb.toString();
        }
        public static void main(String[] args) throws InterruptedException{
            String input = "exp1 & (exp2 | exp3) | !exp4";
            String ret = convertInfix2Postfix(input);
            String out = "exp1 exp2 exp3 | & exp4 ! |";
            System.out.println(ret);
            System.out.println(out.equals(ret));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    思路:
    中缀表达式转后缀表达式,根节点其实就是运算符。利用栈来模拟,算法的具体原理还没想好解释。代码实现先贴着。

  • 相关阅读:
    使用轮廓分数提升时间序列聚类的表现
    Telnet连接
    WoShop跨境电商源码支持多语言和多货币吗?
    Node.js 入门教程 20 查看 npm 包安装的版本 & 21 安装 npm 包的旧版本
    c语言从入门到实战——分支和循环
    python - 进程、线程、协程
    Solidity中的calldata,storage,memory
    面试时Dubbo原理记不住?来看看《Dubbo原理浅析——从RPC本质看Dubbo》
    android下载上拉记载控件com.cjj.materialrefeshlayout:library:1.3.0
    AI大预言模型——ChatGPT与AI绘图及论文高效写作
  • 原文地址:https://blog.csdn.net/weixin_43538042/article/details/133833959