中缀表达式转化为后缀表达式(栈的应用)
2013-08-24 21:07
274 查看
中缀表达式:是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。
后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *
中缀表达式转化为后缀表达式规则:
从左至右读取中缀表达式中的元素,当遇到操作数时直接输出,当遇到操作符时,按以下规则处理:
1)如果遇到的是“(”直接压入栈中
2)如果遇到的是“)”,依次将栈中元素弹出,直到遇到“)”为止,但“)”只弹出,并不输出
3)如果遇到的是非括号(即“+”,“-”,“*”,“/”),那么从栈中弹出栈元素直到发现优先级更低的元素或栈为空为止。当从栈弹出元素的工作完成后,再将刚刚读入的操作符压入栈中。
例:
将中缀表达式a+b*c+(d*e+f)*g转化为后缀表达式,结果为 a b c * + d e * f + g * +
首先,a被读入,直接输出。然后,“+”被读入并压入栈中。接着b读入并输出:
接着“*”读入。栈顶元素比“*”的优先级低,故没有输出,“*”进栈。接着,c被读入并输出:
后面的一个符号是“+”号。此时,栈顶元素“*”的优先级比“+”高,故需将“*”从栈中弹出并输出;弹出后栈顶元素为“+”号,优先级并不比刚读入的“+”号优先级低,故依然将栈顶元素“+”弹出。然后将刚刚遇到的“+”压入栈中
下一个被读入的符号是“(”,由于有最高的优先级,因此直接压入栈中。然后,d读入并输出。
紧接着,又读入一个“*”。除非遇到“)”,否则“(”绝不会从栈中弹出,因此,没有输出。下一个读入e,直接输出。
再往后读入符号“+”。依据规则3,我们将“*”弹出并输出,然后将“+”压入栈中。然后,读入f并输出
现在,读到一个“)”,依据规则2,将栈元素依次弹出并输出,直到“)”弹出。
接着又读入一个“*”,压入栈中。然后读入g并输出
现在输入为空,因此我们将栈中的符合全部弹出并输出,直到栈为空
练习:
http://acm.nyist.net/JudgeOnline/problem.php?pid=467
http://acm.nyist.net/JudgeOnline/problem.php?pid=267
后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *
中缀表达式转化为后缀表达式规则:
从左至右读取中缀表达式中的元素,当遇到操作数时直接输出,当遇到操作符时,按以下规则处理:
1)如果遇到的是“(”直接压入栈中
2)如果遇到的是“)”,依次将栈中元素弹出,直到遇到“)”为止,但“)”只弹出,并不输出
3)如果遇到的是非括号(即“+”,“-”,“*”,“/”),那么从栈中弹出栈元素直到发现优先级更低的元素或栈为空为止。当从栈弹出元素的工作完成后,再将刚刚读入的操作符压入栈中。
例:
将中缀表达式a+b*c+(d*e+f)*g转化为后缀表达式,结果为 a b c * + d e * f + g * +
首先,a被读入,直接输出。然后,“+”被读入并压入栈中。接着b读入并输出:
接着“*”读入。栈顶元素比“*”的优先级低,故没有输出,“*”进栈。接着,c被读入并输出:
后面的一个符号是“+”号。此时,栈顶元素“*”的优先级比“+”高,故需将“*”从栈中弹出并输出;弹出后栈顶元素为“+”号,优先级并不比刚读入的“+”号优先级低,故依然将栈顶元素“+”弹出。然后将刚刚遇到的“+”压入栈中
下一个被读入的符号是“(”,由于有最高的优先级,因此直接压入栈中。然后,d读入并输出。
紧接着,又读入一个“*”。除非遇到“)”,否则“(”绝不会从栈中弹出,因此,没有输出。下一个读入e,直接输出。
再往后读入符号“+”。依据规则3,我们将“*”弹出并输出,然后将“+”压入栈中。然后,读入f并输出
现在,读到一个“)”,依据规则2,将栈元素依次弹出并输出,直到“)”弹出。
接着又读入一个“*”,压入栈中。然后读入g并输出
现在输入为空,因此我们将栈中的符合全部弹出并输出,直到栈为空
练习:
http://acm.nyist.net/JudgeOnline/problem.php?pid=467
http://acm.nyist.net/JudgeOnline/problem.php?pid=267
相关文章推荐
- 中缀表达式转化为后缀表达式(栈的应用)
- 中缀表达式转化为后缀表达式(栈的应用)
- 栈的应用:中缀表达式转化为后缀表达式(逆波兰表达式)
- 栈应用之将中缀表达式转化为后缀表达式(逆波兰表达式)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 数据结构算法:中缀表达式转化为后缀表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 中缀表达式转化为后缀表达式
- 栈的应用4--中缀表达式转换为后缀表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
- 算法——四则运算器(中缀表达式转换为后缀表达式并求值)(堆栈的应用)
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
- 将中缀表达式转化成后缀表达式
- java中使用栈将中缀表达式转化为后缀表达式
- 数据结构之线性表——中缀表达式和后缀表达式(栈的应用)
- 简单计算器求值(中缀表达式转化成后缀表达式)
- 栈的应用 后缀表达式求值 后缀表达式与中缀表达式的转换
- 中缀表达式转化为后缀表达式、后缀表达式求解(栈)
- 中缀表达式转化为后缀表达式