数据结构习题:进阶实验3-3.1 求前缀表达式的值 (25分)

进阶实验3-3.1 求前缀表达式的值 (25分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。

输入样例: + + 2 * 3 - 7 4 / 8 4
输出样例: 13.0

做这道题的时候,我是先实现运算数均为单个数字(例如3)的情况,没有通过所有测试点;在此基础上,实现运算数存在连续数字(例如123)的情况,也没有通过所有测试点;又在此基础上,再实现运算数存在浮点数(例如123.55)的情况,通过了所有测试点。在连续数字和浮点数情况中,我是以字符单独输入后再组装成一个整数或者浮点数,最后代码写得有点庞大,也有点乱。这里直接写写解题思路吧,参考了weixin_42104573的一篇博客。
原文链接:https://blog.csdn.net/weixin_42104573/article/details/80431862?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

前缀表达式求值解题思路:

从右到左扫描前缀表达式,从右边第一个字符开始判断,如果当前字符(或字符串)为数字,则压入栈内;如果是运算符,则将栈顶两个元素弹出栈外并作相应运算,再将结果压入栈内。当前缀表达式扫描结束时,栈里的就是中缀表达式运算的最终结果。
以+ + 2 * 3 - 7 4 / 8 4为例:
从右向左进行扫描
读入运算数4,压栈;
读入运算数8,压栈;
读入运算符/,将栈顶两个元素8和4弹出,后入栈的数字先出栈,做分子,先入栈的数字后出栈,做分母,8/4=2,将结果2压栈;
读入运算数4,压栈;
读入运算数7,压栈;
读入运算符-,将栈顶两个元素7和4弹出,7-4=3,将结果3压栈;
读入运算数3,压栈;
读入运算符*,将栈顶两个元素3和3弹出,3*3=9,将结果9压栈;
读入运算数2,压栈;
读入运算符+,将栈顶两个元素2和9弹出,2+9=11,将结果11压栈;
读入运算符+,将栈顶两个元素11和2弹出,11+2=13,将结果13压栈;扫描完毕后,栈内元素为13,即为结果,输出。

你可能感兴趣的:(数据结构习题:进阶实验3-3.1 求前缀表达式的值 (25分))