【中缀、后缀表达式(整数)的介绍、转换及运算】

一.简介

前缀:波兰表达式(运算符在操作数之前) 如 (+ - * 3 4 5 6)
中缀:我们常见的表达式 如(3+4)* 5 – 6,便于人的理解,不利于计算机计算。
后缀:又称逆波兰表达式,如(3 4 + 5 * 6 -),便于计算机计算,但是不利于人的理解。

二.中缀表达式转后缀表达式

具体转换方式:
方式一:
1.从左到右进行遍历
2.运算数:直接输出.
3.左括号:直接压入栈(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈)
4.右括号,(意味着括号已结束)不断弹出栈顶运算符并输出,直到遇到左括号(括号弹出但不输出)
5.运算符,将该运算符与栈顶运算符进行比较,
如果优先级高于栈顶运算符,则压入栈(暂时不进行运算)。
如果优先级小于等于栈顶的运算符,则将栈顶运算符弹出并输出,然后比较新的栈顶运算符。
6.如果对象处理完毕,则按顺序弹出并输出栈中所有运算符。

举例如下

步骤 数据 栈(栈底–>栈底) 输出
1 (3+5)*5-6
2 3+5)*5-6 (
3 +5)*5-6 ( 3
4 5)*5-6 ( + 3
5 )*5-6 ( + 3 5
6 *5-6 3 5 +
7 5-6 * 3 5 +
8 -6 * 3 5 + 5
9 6 - 3 5 + 5 *
10 - 3 5 + 5 * 6
11 3 5 + 5 * 6 -

方式二: 按照运算的顺序,每一次运算加一个括号,然后将运算符放到括号后边
注:步骤二输出结果有括号是为了表示3 5 +是一个整体,方便与后面的进行运算

步骤 数据 输出
1 (3+5)* 5 – 6
2 ((3+5))* 5 – 6 (3 5 +)* 5 – 6
3 ((3 5 +)* 5) – 6 3 5 + 5 * – 6
4 (3 5 + 5 * )– 6 3 5 + 5 * 6 -

三.中缀表达式转后缀表达式代码实现

以下有三个方法
1.change():该方法入参是一个中缀表达式-------作用是将中缀表达式转化成后缀表达式的集合

原式:(3+4)*5-6
中缀list输出结果[(, 3, +, 4, ), *, 5, -, 6]

2.compare():该方法是对运算符进行一个优先级的比较,返回1和2-----通过int类型比较比字符串比较方便。
3.out():该方法是将中缀表达式集合转化成后缀表达式集合。

中缀list输出结果[(, 3, +, 4, ), *, 5, -, 6]
后缀list输出结果[3, 4, +, 5, *, 6, -]

 //将中缀表达式(字符串)转化成list   (3+4)*5-6
    public static List<String> change(String expression){
   
        List<String> list = new ArrayList<>();
        int index = 0 ;//下标
        char c ;//存放每一次遍历的字符
        String str;
        do {
   
            if ((c=expression.charAt(index)) < 48 || (c=expression.charAt(index)) > 57 ){
   //不是数字
                list.add(c+"");
                index ++;
            }else{
   //是数字
                str = "";//置空
                while (index < expression.length() && (c=expression.charAt(index)) >= 48 &&(c=expression.charAt(index)) <= 57 ){
   //继续往后遍历,直到遇到不是数字的
                    str += c;
                    index ++;
                }
                list.add(str);
            }
        }while(index < expression.length());
        return list;
    }

//中缀转后缀
    public static List<String> out(List<String> list){
   
        Stack<String> s = new Stack<>();//存放符号
        List<String> l = new ArrayList<>();//存放输出的值
        //循环遍历list
        for (String s1: list) {
   
            if (s1.matches("\\d+")){
   //正则匹配数字
                l.add(s1);
            }else if (s1.equals("(")){
   //如果是"("
                s.push(s1);
            }else if (s1.equals(")")){
   //如果是")"
                //弹出栈中的符号,放入输出的集合中,直到遇到"("
                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值