本文章的解决方法参考了《大话数据结构》中关于栈的应用介绍
值得注意的是,书中关于中缀表达式转后缀的讲解中不尽清楚。本人也在这里花了点时间进行推敲错误的原因,也在网上搜到了这篇文章,比较好地介绍了中缀转后缀的的规则
原理:
用计算机求解四则运算,可以使用栈。因为栈的“先进后出”的特性正好满足了能通过后缀表达式去计算出四则运算式子的结果。而后缀表达式的转化也能使用栈对中缀表达式进行操作从而转化。明显地,由中缀表达式-》后缀表达式, 后缀表达式-》式子结果。 都需要使用到栈。所以编码实现中,我们着重的是实现这两个过程的函数(infix_to_suffix()、suffix_to_result())
注意:
测试数据
- 每个数可以是只达个位的数,也可以达十位以上的数
- 可以是负数或正数(负数需在两边添加括号)
- 括号内能存在多个括号,例:( ( 2 + 3 ) + ( 4 + 5 ) + ( ( 6 + 7 ) + 8 ) )
实现
- 定义了一个全局table用来存储各个运算符的优先级。 + - 等优先级,* / 等优先级, ()不存在优先级(这里主要为了代码实现而取消其优先级)
- 设置了一个 priority 变量进行存储栈顶元素的优先级,这在中缀转后缀的时候被使用到,并在每次的压栈出栈后,都须对新的栈顶元素进行记录其优先级
- 在中缀转后缀的函数中,主要包含这几部分:1. 遇到数字直接输出,然后continue 2.左括号直接压栈,然后continue 3. 右括号则将将栈中在左括号以上的所有运算符弹出&