初识后缀表达式

什么是后缀表达式?
说到后缀表达式 我们先说下中缀表达式吧,中缀表达式其实就是我们平常看到的表达式例如:12+(19-48+5/8)
那么后缀表达式呢? 顾名思义 运算符号在后面的表达式:12 19 48 - 5 8 / + +


也许刚看到这串字符会很懵圏 我们来下慢动作:
这里写图片描述

可以看到 中缀表达式转换成后缀表达式时
检索第一个 为数字 在后缀表达式中直接 添加
如果 为 运算符号 则在栈中 添加
如果为( 则在栈中添加
如果为) 则将( 调至栈顶 并弹出栈
如果栈中有2个 或多于两个运算符 则 比较 栈最上方的两个运算符的 优先级 将优先级大的 填到后缀表达式中 并弹出


后缀表达式的转换呢 大概就是这样 主要运用了栈的知识

小白我呢 也不知道该怎么运用这些知识点所以 用ArrayList 来存储 模拟栈

不是全部的代码=。= 写的有些乱

 private ArrayList Conversion(ArrayList arrayList) {
        //mSuffix 结果
        mSuffix = new ArrayList();
        //运算符
        mOperation = new ArrayList();
        j = 0;
        for (int i = 0; i < arrayList.size(); i++) {
            if (arrayList.get(i) == "+" || arrayList.get(i) == "-") {
                mOperation.add((String) arrayList.get(i));
                getFirst();
            } else if (arrayList.get(i) == "*" || arrayList.get(i) == "/") {
                mOperation.add((String) arrayList.get(i));
                getFirst();
            } else if (arrayList.get(i) == "(") {
                mOperation.add((String) arrayList.get(i));
                j =1;
            } else if (arrayList.get(i) == ")") {
                j =0;
                if (mOperation.size()>=1&&mOperation.get(mOperation.size()-1) == "("){
                    mOperation.remove(mOperation.size()-1);
                }
                if (mOperation.size() >= 2) {

                    if (mOperation.get(mOperation.size() - 2) == "(") {
                        mSuffix.add(mOperation.get(mOperation.size() - 1));
                        mOperation.remove(mOperation.size() - 1);
                        mOperation.remove(mOperation.size() - 1);
                    } else {
                        getFirst();
                        if (mOperation.get(mOperation.size() - 2) == "(") {
                            mSuffix.add(mOperation.get(mOperation.size() - 1));
                            mOperation.remove(mOperation.size() - 1);
                            mOperation.remove(mOperation.size() - 1);
                        }
                    }

                }
            } else {
                mSuffix.add((String) arrayList.get(i));
            }
            if (i == arrayList.size() - 1) {
                if (mOperation.size()>0){
                getLast();
                }
            }
        }
        return mSuffix;
    }

嗯 中缀转换成了后缀表达式以后呢 反正不能看着吧 在看下如何计算的
其实计算就比较容易了 简单的说也就一句话“检索到运算符的时候计算运算符前的2个数”
举个栗子:12 19 48 - 5 8 / + +
一个数一个数的读取 如下图
这里写图片描述

代码呢 如下:

public String Calculation(ArrayList<String> arrayList) {
        String jieguo;
                for (int i = 0; i <arrayList.size(); i++) {
                    if (arrayList.get(i) == "+") {
                        jieguo = MyMath.add(arrayList.get(i - 2), arrayList.get(i - 1));
                        arrayList.remove(i);
                        arrayList.remove(i - 1);
                        arrayList.remove(i - 2);
                        i = i - 2;
                        arrayList.add(i, jieguo);
//                        Calculation(changeString(result),changeString(result).size());
                    } else if (arrayList.get(i) == "-") {
                        jieguo = MyMath.subtract(arrayList.get(i - 2), arrayList.get(i - 1));
                        arrayList.remove(i);
                        arrayList.remove(i - 1);
                        arrayList.remove(i - 2);
                        i = i - 2;
                        arrayList.add(i, jieguo);
//                        Calculation(changeString(result),changeString(result).size());
                    } else if (arrayList.get(i)== "*") {
                        jieguo = MyMath.multiply(arrayList.get(i - 2), arrayList.get(i - 1));
                        arrayList.remove(i);
                        arrayList.remove(i - 1);
                        arrayList.remove(i - 2);
                        i = i - 2;
                        arrayList.add(i, jieguo);
//                        Calculation(changeString(result),changeString(result).size());
                    } else if (arrayList.get(i) == "/") {
                        if (arrayList.get(i - 1).equals("0")) {
                            return "除零了";
                        } else {
                            jieguo = MyMath.divide(arrayList.get(i - 2), arrayList.get(i - 1));
                            arrayList.remove(i);
                            arrayList.remove(i - 1);
                            arrayList.remove(i - 2);
                            i = i - 2;
                            arrayList.add(i, jieguo);
                        }
                    }
                }

        return arrayList.get(0);
    }

唔 算是第一次写博客吧·· 哈哈这里小白 从零开始系列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值