后缀表达式转中缀表达式

中缀转后缀:中缀表达式转换为后缀表达式 

大概意思就是:遇到数字就输出,遇到符号(包括括号)就压入栈,如果当前符号优先级比栈顶的低,就把栈顶的符号输出,平级的也都输出,到左括号(优先级最高为止),然后当前符号入栈,如果遇到右括号,就将符号栈顶的符号依次输出,遍历完成之后,栈里的符号依次输出即可;括号不用输出;

注:这里的后转中,后缀含括号;

package OffLineTest;

/*
* 中缀表达式向后缀表达式的转换方法:
      规则:从左到右遍历中缀表达式的每个数字和符号,
      若是数字就输出,即成为后缀表达式的一部分;
      若是符号,就判断当前符号与栈顶符号的优先级,
      如果是右括号或者是优先级低于栈顶符号(乘除优先加减),
      则栈顶元素依次出栈并输出(全部输出,如果是右括号,则到左括号输出为止),
      当前符号进栈,如此进行直到最终输出后缀表达式。
* */

/*
输入后缀表达式:9(31)-3*+12/+
转为字符数组:[9, (, 3, 1, ), -, 3, *, +, 1, 2, /, +]
反转:[+, /, 2, 1, +, *, 3, -, ), 1, 3, (, 9]
存入栈num中的形式:2/1+3*)1-3(+9
输出中缀表达式:9+(3-1)*3+1/2

* 后缀转中缀思路:将后缀反转存为 midReverse数组,符号存在栈sign中,结果存在栈 num 中,
* 遍历midReverse ,遇到符号就存入sign ,
* 判断下个字符是否为左括号')',直接输入num,(因为括号表达式的第一个括号后面跟的的数字不是符号,但第二个匹配的括号后面跟的是符号,这里要弄清楚,因为是反序遍历,然后最终结果是将num的栈顶的元素一个个输出,所有括号是反的;)
* 遇到数字就存入num,紧接着删除sign的栈顶元素并存入num(因为中缀表达式为一个数字一个符号的形式),
* 判断下个字符是否为左括号'(',若是,则将'('存入,并删除sign的栈顶元素存入num,如例子所示,'2/1+3*)1-3(','('左括号之后应该为‘+’号,如果不设置这个条件,输出的就是'9'了;
* */

import java.util.*;

public class InfixExpression {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] mid = in.nextLine().toCharArray();
        System.out.println("输入: "Arrays.toString(mid));
        char[] midReverse = new char[mid.length];
        for (int i = 0; i < mid.length; i++) {
            midReverse[i] = mid[mid.length - 1 - i];
        }
        System.out.println("反转后: "Arrays.toString(midReverse));

        Stack<Character> sign = new Stack<Character>();
        Stack<Character> num = new Stack<Character>();
        Map<Character, Integer> signMap = new HashMap<Character, Integer>();
        signMap.put('+', 1);
        signMap.put('-', 1);
        signMap.put('*', 2);
        signMap.put('/', 2);

        Character c;
        Character temp;
        for (int i = 0; i < midReverse.length; i++) {
            c = midReverse[i];
            if (signMap.containsKey(c))
                sign.push(c);
            else if ((Character.isDigit(c))) {
//                if (sign.isEmpty()) continue;
                num.push(c);
                if( i == midReverse.length -1) break;
                if(midReverse[i+1] == '(')  {
                    num.push('(');
                    i +=1;
                }
                temp = sign.pop();
                num.push(temp);

            } else if ((c == ')')) {
                num.push(c);
            }
        }

        //output
        System.out.print("中缀表达式:");
        char a;
        int len = num.size();
        for(int i = 0; i < len; i ++){
            a = num.pop();
            System.out.print( a);
        }
    }
}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值