首页 > 其他 > 详细

中缀表达式转后缀表达式的简单实现

时间:2020-09-19 13:11:28      阅读:38      评论:0      收藏:0      [点我收藏+]

分析步骤:

技术分享图片

 

实现代码:

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;
    }
}

 

中缀表达式转后缀表达式的简单实现

原文:https://www.cnblogs.com/cai170221/p/13695521.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!