求助!

P1449 后缀表达式

nobody_here @ 2024-08-01 21:37:05

#include<bits/stdc++.h>
using namespace std;
int main(){
    stack<char> a;
    char w;
    int n=0,m=0,y=0;
    cin>>w;
    do{
        if(w=='/' || w=='*' || w=='-' || w=='+'){
            n=a.top()-'0';
            a.pop();
            m=a.top()-'0';
            a.pop();
            if(w=='/'){
                y=n/m;
                a.push(y+'0');
            }else if(w=='*'){
                y=n*m;
                a.push(y+'0');
            }else if(w=='-'){
                y=n-m;
                a.push(y+'0');
            }else{
                y=n+m;
                a.push(y+'0');
            }
        }else if(w=='.'){
            /*37*/
        }else{
            a.push(w);
        }
        cin>>w;
    }while(w=='@');
    cout<<a.top()-'0';
    return 0;
}

实在写不出了,dalao们救救我


by zzhhyy1234 @ 2024-08-04 10:53:21

while(w=='@');

首先这个会使你的程序在输入字符不为@时跳出,所以这个循环就没了


by zzhhyy1234 @ 2024-08-04 10:54:32

改成下面这样才能循环

while(w!='@');

by zzhhyy1234 @ 2024-08-04 10:56:13

然后我们观察到这个

m=a.top()-'0';
a.pop();
n=a.top()-'0';
a.pop();

by zzhhyy1234 @ 2024-08-04 11:00:47

我们有两个数x,y 入栈变成

y
x

像上面写n=x,m=y,符合原本数据

而我们发现

你的程序翻转了计算


by zzhhyy1234 @ 2024-08-04 11:02:29

对于加法和乘法,它们符合交换率,你的程序没有问题,但对于减法和除法会出现问题


by zzhhyy1234 @ 2024-08-04 11:04:02

现在这么改,你的程序可以过样例一了


by zzhhyy1234 @ 2024-08-04 11:07:21

我们发现:样例一的数only一位,所以能过样例一


by zzhhyy1234 @ 2024-08-04 11:08:24

显然,你的程序没有考虑w>=10的情况


by zzhhyy1234 @ 2024-08-04 11:12:50

我们考虑

else if(w=='.'){
    /*37*/

改为

else if(w=='.'){
    a.push(x);
    x=0;
    flag=0;
}

stack<char> a;

改为

stack<int> a;

并且定义x=0,flag=0


by zzhhyy1234 @ 2024-08-04 11:14:22

在最后一个else内部加入

if(flag==0){ 
    flag=1;  
    x=c-'0'; 
}            
else{        
    x*=10;   
    x+=c-'0';
}

| 下一页