1.题目
7-7 求前缀表达式的值
分数 25
全屏浏览
切换布局
作者 DS课程组
单位 浙江大学
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、/
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR
。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
2 .分析
用到两个栈 先把前缀表达式存入栈1,然后从末尾向前扫描.
如果遇到数字入栈2。
遇到运算符,将栈2的2个栈顶元素弹出运算,再把运算结果再次入栈2。
重复上述操作,最后栈2的元素就是结果。
注意的点是:除法运算时要注意除数为0的情况
3.代码
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<string> s; //栈1
stack<string> c; //栈2
string ch,str;
double a,b;
bool f=true; //判断除数为0的情况
while(cin>>str){s.push(str);}
while(!s.empty()){
if(s.top()!="+"&&s.top()!="-"&&s.top()!="*"&&s.top()!="/"){ //不是运算符入栈2
c.push(s.top());
s.pop();
}
else{
if(s.top()=="+"){ //判断是哪种运算符
s.pop();
a=stod(c.top());
c.pop();
b=stod(c.top());
c.pop();
c.push(to_string(a+b));
}
else if(s.top()=="-"){
s.pop();
a=stod(c.top());
c.pop();
b=stod(c.top());
c.pop();
c.push(to_string(a-b));
}
else if(s.top()=="*"){
s.pop();
a=stod(c.top());
c.pop();
b=stod(c.top());
c.pop();
c.push(to_string(a*b));
}
else if(s.top()=="/"){
s.pop();
a=stod(c.top());
c.pop();
b=stod(c.top());
c.pop();
if(b){c.push(to_string(a/b));} //如果除数为0,输出error
else{
f=false;
break;
}
}
else{f=false;}
}
}
if(f){
a=stod(c.top());
printf("%.1f",a); //保留一位小数
}
else{cout<<"ERROR"<<endl;}
return 0;
}
标签:前缀,top,pop,else,stod,表达式
From: https://blog.csdn.net/m0_75262437/article/details/139454682