四则混合运算和后缀表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
///
四则混合运算。
波兰表达式。
逆波兰表达式(后缀表达式)生成算法:
(1)构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示法表示的简单算术表达式,为方便起见,认为地在字符串后面加入一个特殊字符“;”,并设其优先级为0。
(3)从左至右扫描该算术表达式的每一个字符,如果该字符是数字,则分析到该数字串的结束并将该数字串加入结果字符串,小数点亦算入数字串。
(4)如果该字符是运算符,则按如下操作:优先级高的放在前面,通过出入栈操作。
如果该字符是左括号“(”,则该字符直接压入运算符栈。
如果该字符是右括号“)”,则把运算符栈顶元素弹出直至第一次遇到左括号。如果该字符是算术运算符且其优先关系高于运算符栈顶的运算符,则将该运算符入栈。
否则,将栈顶的运算符从栈中弹出至结果字符串末尾,直至栈顶运算符的优先级低于当前运算符,并将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式(遇到特殊字符“;”)。
如:
一般简单表达式:((4+5)*6-5)/2+3*2
逆波兰表达式:4 5 + 6 * 5 - 2 / 3 2 * +
步骤如下:
运算符栈结果字符串
第1步:; ""
第2步:;( ""
第3步:;(( ""
第4步:;(( "4"
第5步:;((+ "4 5"
第6步:;( "4 5 +"
第7步:;(* "4 5 +"
第8步:;(* "4 5 + 6"
第9步:;(- "4 5 + 6 *"
第10步:;(- "4 5 + 6 * 5"
第11步:; "4 5 + 6 * 5 -"
第12步:;/ "4 5 + 6 * 5 -"
第13步:;/ "4 5 + 6 * 5 - 2"
第14步:;+ "4 5 + 6 * 5 - 2 /"
第15步:;+ "4 5 + 6 * 5 - 2 / 3"
第16步:;+* "4 5 + 6 * 5 - 2 / 3"
第17步:;+* "4 5 + 6 * 5 - 2 / 3 2"
第18步:;+ "4 5 + 6 * 5 - 2 / 3 2 *"
第19步:; "4 5 + 6 * 5 - 2 / 3 2 * +"
其中运算符优先级如下:
* / :2
+ - :1
;:0
逆波兰表达式求值算法:
(1)构建一个操作数栈,类型为float;
(2)依次扫描逆波兰表达式的每一项;
(3)如果是数字串则压入操作数栈;
(4)如果是运算符,则从操作数栈顶弹出两个操作数,与运算符进行运算,结果压入操作数栈。
(5)不断重复以上步骤直至扫描完逆波兰表达式。
(6)此时操作数栈必定只剩一个数据,即为逆波兰表达式的值,弹出输出。如:如上表达式计算结果为:30.5.