对于常见的 1+3*5-4/2 这种我们常用的表达式我们称为中缀表达式
而还有一种是将运算符放在后面的表达式称为后缀表达式
对于上面这个式子,我们现将计算的顺序用括号补齐,则变为((1+(3*5))-(4/2))
当然加减的顺序看个人喜好了(甚至不加也可以),那我们按照这个顺序将这个中缀表达式变为后缀表达式,则是1 + 3 5 * - 4 2 /
我们要做这个变换(默认补齐了括号),其实思路还是比较好理解的,对于数字的处理相对简单(因为仅就数字而言,输出的顺序是没有变的)
那么剩下的就是对运算符的处理了,加减乘除要按什么顺序输出,这里用到栈的思想就比较容易处理了
首先我们建立两个栈,我称之为a b
a存放运算符,b存放后缀表达式,我们最终直接输出b
先输入一个字符串s,然后对 s 中的每个元素进行逐个处理
如果是数字我们直接加入b,对于(直接加入a,对于)就弹出a中第一个(之后所有元素到b,然后删除这两个括号
那么对于运算符(设为c),我们每次都和a的栈顶进行比较
如果 c 是一级运算符的话,循环弹出栈顶元素到b直到栈顶为(或为空时停止
而 c 是二级运算符的话,栈顶也是二级运算符就弹出栈顶到b,这个操作直到栈顶为一级运算符或为(或为空时停止
最后将 c 加入a
以下是实现的代码
#include<iostrea