有没有人帮我看看我的波兰表达式哪里错了
2026-07-28 13:42:52
发布于:浙江
题目
题目描述
波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式 2+3 的逆波兰表示法为 +23。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如 (2+3)∗4 的波兰表示法为 ∗+234 。本题求解波兰表达式的值,其中运算符包括 +−∗/ 四个
输入描述
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出描述
输出为一行,表达式的值。
可直接用 printf("%f\n", v) 输出表达式的值v。
用例输入 1
* + 11.0 12.0 + 24.0 35.0
用例输出 1
1357.000000
代码
#include<bits/stdc++.h>
using namespace std;
char c[505];
long double ans=0;
int n=0,cnt0,cnt1;
stack<long double>s2;
struct byd{
int op;
long double f;
char c;
}a[114514];
int main(){
while(cin>>c){
if(c[0]>='0'&&c[0]<='9'||c[0]=='.'){
a[++n].op=0;
float f=atof(c);
a[n].f=f;
cnt0++;
}else{
a[++n].op=1;
a[n].c=c[0];
cnt1++;
}
}
for(int i=n;i>=1;i--){
if(a[i].op==0){
s2.push(a[i].f);
}else{
long double x,y;
x=s2.top();s2.pop();
y=s2.top();s2.pop();
if(a[i].c=='+')s2.push(x+y);
else if(a[i].c=='-')s2.push(x-y);
else if(a[i].c=='*')s2.push(x*y);
else if(a[i].c=='/')s2.push(x/y);
//cout<<x<<','<<y<<"->"<<s2.top()<<'\n';
}
}
if(cnt0-cnt1!=1)return s2.size();
printf("%Lf",s2.top());
return 0;
}
全部评论 3
第14行 float f=atof(c);
atof(c)返回的是double,你用了float去存,精度不够。后面即使用了long double,那也存的是已经被近似的数据了;
第23~24行 x=s2.top();s2.pop(); y=s2.top();s2.pop();
你是从右往左逆序遍历数组(for i=n;i>=1),所以先弹出来的x其实是后入栈的操作数,后弹出来的y才是先入栈的操作数;
第27行 else if(a[i].c=='-')s2.push(x-y);
实际执行的是 后入栈的 − 先入栈的。比如输入 3 5 -,期望 3−5=−2,你算的是 5−3=2;
第28行 else if(a[i].c=='/')s2.push(x/y);
同第27行,5 2 / 期望 5÷2=2.5,实际 2÷5=0.4;
第19行 for(int i=n;i>=1;i--){
反着读就会很拧巴,而且只适用于加法或乘法。改成 for(int i=1; i<=n; i++) 配合正确的弹出顺序会更好。
!当然我不确定我说的对不对,只是凭感觉
2026-07-26 来自 天津
2第一条已改;
第二条和第三条好像负负得正了。
目前还是有点错2026-07-26 来自 浙江
0
细节byd
2026-07-25 来自 浙江
1d
2026-07-30 来自 浙江
0



























有帮助,赞一个