0. 例题
编写一个程序可以完成基本的带括号的四则运算。其中除法(/)是整除,并且在负数除法时向0取整。(C/C++/Java默认的除法就是向0取整,python默认的是向负无穷取整)。
例如计算 100 * ( 2 + 12 ) - (20 / 3) * 2
, 结果是1388
。
样例输入:100*(2+12)-(20/3)*2
样例输出:1388
1. 分析
中缀表达式将二元运算符放在两个操作数之间,而后缀表达式的每个运算符都出现在相应操作数之后。后缀表达式去掉了括号,因此在计算机中,用后缀表达式求值更为简单。100*(2+12)-(20/3)*2
为中缀表达式,其对应的后缀表达式(逆波兰式)为100&2&12+*20&3/2*-
。
用用后缀表达式求值是栈的典型应用,其步骤分为两步:
将中缀表达式转换为后缀表达式
数字:直接添加到后缀表达式中,数值之间需要添加分隔符。
左括号:直接压入到符号栈。
右括号:右括号总是不入栈,遇到右括号,则之前入栈的运算符逐一出栈,并添加到后缀表达式中,直到碰到左括号。遇到左括号直接将其弹出即可。
运算符:运算符入栈之前,与符号栈栈顶的运算符比较优先级,如果优先级小于或等于栈顶运算符优先级,则栈顶运算符弹出,并添加到后缀表达式中,最后将待入栈的运算符入栈(优先级比较时,左括号当作低优先级运算符处理)。
中缀表达式循环一遍之后,最后将符号栈中的运算符逐一弹出,添加到后缀表达式中。
利用后缀表达式求值
数字:根据分隔符取出完整数值,压入到数值栈。数字处理注意如何将数字组合成完整的数值。
运算符:弹出数值栈的栈顶前两个数值,与运算符一起进行四则运算,再将运算结果压入到数值栈,当到达后缀表达式末端时,数值栈中应该只有一个数值,该值即为整个表达式的运算结果。运算符处理时,注意除法中操作数的顺序。
2. 中缀表达式转换为后缀表达式
|
|
3. 根据后缀表达式求值
|
|
4. 测试主函数
|
|