Java实现中缀表达式转后缀表达式


一、中缀表达式转后缀表达式的方法

此处偷一下懒,直接引用别人的思想总结,写的比较好哦!
中缀转后缀的三个基本方法(简单易懂)


二、实现代码

import java.util.*;

/**
 * @Author 玛卡巴卡
 * @Date 2020/11/7 0007 13:09
 * @Dscription:使用上文链接中提到的第一个方法实现中缀表达式转后缀表达式,
 * 以下是几个关键点的总结:
 *  1.使用 Map 作为运算符的优先级集合;
 * 	2.栈 Stack<Character>st 为操作符栈,负责存放操作符以及对操作符的一些排序操作;
 * 	3.队列 LinkedList<Character>list 为后缀队列;
 * 	4.基本的代码逻辑为:
 * 		4.1.如果为数字,直接进队列;
 * 		4.2.如果栈顶元素为左括号或当前元素为左括号,直接压栈;
 * 		4.3.如果当前元素为右括号,进行(将栈顶元素弹出并存放到后缀队列中)的操作,一直到栈顶元素
 * 			为左括号时为止,并注意要将左括号也弹出;
 * 		4.4.如果栈顶元素的优先级小于等于当前元素的优先级,将当前元素压栈;否则,将栈顶元素
 * 			依次弹栈知道栈顶元素的优先级不大于当前元素的优先级为止;
 * 		4.5.操作完成后,将栈依次弹出入队;
 */
public class PostfixDemo {
	public static void main(String[]args){
		testPostFix();
	}
    public void testPostFix(){
        postDix("12*(3+4*5)-6+8/2");
    }
    private void postFix(String str){
        Map<Character,Integer> map = new HashMap<>();
        map.put('+',1);
        map.put('-',1);
        map.put('*',2);
        map.put('/',2);
        map.put('#',0);
        Stack<Character> st = new Stack<>();
        LinkedList<Character> list = new LinkedList<>();
        List<Character> postFix = caculatePostFix(str, map, st, list);
        for (Character c :postFix)
            System.out.print(c+" ");
    }
    private List<Character> caculatePostFix(String str, Map<Character, Integer> map, Stack<Character> st, LinkedList<Character> list) {
        for(int i=0;i<str.length();i++){
            char ch = str.charAt(i);
            //此处是为了结果好区分,每个数字后面都会跟上逗号,这一个if操作可有可无;
            if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'){
                list.addLast(',');
            }
            if(ch>='0'&&ch<='9'){
                list.addLast(ch);
            }else if(st.isEmpty()||st.peek()=='('||ch=='('){
                st.push(ch);
            }else{
                if(ch==')'){
                    while(st.peek()!= '('){
                        list.addLast(st.pop());
                    }
                    st.pop();
                    continue;
                }
                if(map.get(st.peek())<=map.get(ch)){
                    st.push(ch);
                }else {
                    while (!st.isEmpty()&&map.get(st.peek())> map.get(ch)){
                        list.addLast(st.pop());
                    }
                    st.push(ch);
                }
            }
        }
        while(!st.isEmpty())
            list.addLast(st.pop());
        return list;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值