0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现;
0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理清它的原理),故源代码中 考虑的数字是一位整型数(由于若是是两位数及以上的话,还涉及到字符串转int类型,虽然,咱们没有加入其功能,可是仍是定义了相关的函数,给出了接口的,朋友须要的话,能够自行实现)、还有就是 运算符的话,只考虑到了 *、+、(、),一样,若是朋友些须要的话,能够自行增长case 语句 or if 语句添加上便可;
0.3) 须要注意的是,操做数operand 和 操做符(运算符)operator 只能用char 类型将它们区分开;在中缀转后缀的过程当中,只能用char类型的空间来存储它们的ASCII值(固然int空间也能够,也是存储它们的ASCII值);
0.4) 在计算后缀的过程当中,须要把数字字符串(如123,它的ASCII序列为 49 50 51)转为int 类型或其余数据类型,因此本文中的源代码只处理 一位 整数的状况;朋友须要的话,自行添加;
0.5) 对于写算法代码的感悟, 重在理清算法原理 or idea,不要把输入输出的各类状况都考虑到, 那样很累,很烧精力,影响学习进度;其实只要实现了其 简单版本,实现复杂状况 也不是那样难;总之一句话,学习期间,咱们不追求完美,一切从简,重在理解算法idea;
0.6) 题外话,曾经看到一位前辈说,栈有两种实现方法——数组实现+链表实现, 说在工做中,栈的数组实现应用的比较多,链表实现基本不怎么用,因此,你知道侧重点在哪里了;(固然能够 看看 栈的链表实现 了解了解)
git
1.1)此方法须要遵循几个规则(Rule):github
1.2)看个荔枝【 将中缀表达式:a + b * c + (d * e + f) * g 转换为 后缀表达式: a b c * + d e * f + g * + 】
咱们来看转换步骤:算法
step1)读入a,a被输出;读入+, 因为操做符栈空,故+进栈;读入b,b被输出;栈和输出的状态以下:
数组
step9)读完表达式后,栈中还有操做符,将它们出栈,并放入到输出字符串;栈和输出的状态以下:
ide
中缀转后缀的源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter3/p54_infix_to_postfix
函数
2.1)后缀表达式定义: 4.991.06 + 5.99 + 6.991.06 转换为后缀表达式为: 4.99 1.06 * 5.99 + 6.99 1.06 * +;这种记法叫作 后缀 或者 逆波兰 记法;post
2.2) 计算一个后缀表达式花费的时间是O(N);学习
2.3)计算后缀表达式规则(Rules):idea
2.4)看个荔枝(计算后缀表达式 1 2 3 * + 4 5 * 6 +7 * + )接口
step11)最后栈中就只有一个元素189了,因此结果就是189,并将其返回到主函数;
Attention)当一个表达式以 后缀记号 给出时,没有必要知道任何优先级规则, 这是一个明显的优势;