社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
原表达式:a*(b*(c+d/e)-f)# /* # 为表达式结束符号*/
后缀式:abcde/+*f-*#
为运算符定义优先级:# ( + - * / **
-1 0 1 1 2 2 3
从原表达式求后缀式的规则为:
1.设定运算符栈
2.假设表达式的结束符为"#",我们需要预设运算符栈底元素为"#"
3.扫描表达式,若当前字符是操作数,则直接发送给后缀表达式;
4.若当前字符为运算符且优先级大于等于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀式。然后将当前运算符放入栈中。
5.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。
6.若当前字符为"(",进栈。
7.若当前字符为")",则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到"("。将栈中"("出栈,不需要发送给后缀式。然后继续扫描表达式。
====
====
举例 下面以(a+b)*c为例子进行说明:
(a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下:
1)a入栈(0位置)
2)b入栈(1位置)
3)遇到运算符“+”,将a和b出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置)
4)c入栈(1位置)
5)遇到运算符“*”,将d和c出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)
经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。
逆波兰式除了可以实现上述类型的运算,它还可以派生出许多新的算法,数据结构,这就需要灵活运用了。逆波兰式只是一种序列体现形式。
结论:1,操作数之间的相对顺序不变,运算符的相对次序不同。
2,中缀表达式是没有意义的,去除了括弧。导致运算结果不一致。
3,前缀式的运算规则是:
连续出现的两个操作数和它们之前且紧靠它们的运算符构成一个最小表达式。可以用前缀式求值。
4,后缀式的运算规则刚好与前缀式相反。
运算符在式中的顺序恰为表达式的运算顺序,(先做乘法,除法,然后加法)每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
后缀式转成原表达式。
依次入栈,遇到运算符,将两个操作数出栈运算,结果再次放到栈顶。依次循环。
从原表达式求的后缀式?
出现了后面的操作数才能确定前面的运算。
注意:左边图上应该是设立运算符栈
每个运算符的运算次序要由它之前的一个运算符来定,在后缀式中,优先级高的运算符领先于优先级低的运算符
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!