数据结构习题—求前缀表达式的值

it2025-02-05  9

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

输入格式:

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

输出格式:

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

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

 

利用栈来存储表达式,因为栈的“先进后出”的特点,将表达式依次弹出时,其顺序就变为了后缀表达式(但两个操作数顺序相反,比如 / 8 4 转化为 4 8 /,而后缀表达式应为 8 4 /),将弹出的表达式按后缀表达式利用栈来运算即可。

代码如下

#include <iostream> #include <string> #include <stack> #include <sstream> #include<iomanip> using namespace std; double fun(double num1,double num2,char oper){ //计算函数 switch(oper){ case '+': return num1+num2; case '-': return num1-num2; case '*': return num1*num2; case '/': return num1/num2; } } int main() { stack<string> a; //用来存放输入的操作数和操作符,起一个容器的作用 stack<double> b; //用来计算 string tmp; //用来存放相关操作数或操作符 int flag=0; //记录运算是否正常 while(cin>>tmp){ //将操作数和操作符压入a栈 char ch=getchar(); a.push(tmp); if(ch=='\n') break; } while(!a.empty()){ //将栈a的元素全部依次弹出 tmp=a.top(); a.pop(); if(tmp[tmp.length()-1]!='+'&&tmp[tmp.length()-1]!='-'&&tmp[tmp.length()-1]!='*'&&tmp[tmp.length()-1]!='/'){ //tmp为操作数 stringstream ss; //利用stringstream将其转化为double型 ss << tmp; double num; ss >> num; b.push(num); //压入b栈 } else{ double num1,num2,num; //num1,num2为操作数,num存放结果 if(b.empty()) {flag=1;break;} //b里面至少有两个操作数,如果为空说明表达式错误,flag为1并跳出 num1=b.top(); b.pop(); if(b.empty()) {flag=1;break;} num2=b.top(); b.pop(); if(tmp[tmp.length()-1]=='/'&&num2==0.0){ //如果除数为0,出现错误,跳出 flag=1; break; } num=fun(num1,num2,tmp[tmp.length()-1]); b.push(num); //将结果压入栈 } } if(!flag){ double result=b.top(); b.pop(); if(b.empty()){ cout << fixed<<setprecision(1)<< result; } } if(!b.empty()||flag) cout << "ERROR"<<endl; return 0; }

 

最新回复(0)