------求助------

P1449 后缀表达式

Shidai_linzihan @ 2019-07-08 23:32:16

碰到了类似的问题,数据下下来好像没错就是WA了,各位dalao能否帮忙看一下

#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
    int s=0,w=1,top=0,a[1010];
    int ch=getchar();
    for(;;){
        while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();//入栈 
        while(ch<'0'||ch>'9'){
            switch(ch){
                case '.':a[++top]=s;break;
                case '+':a[--top]=a[top]+a[top+1];break;
                case '-':a[--top]=a[top]-a[top+1];break;
                case '*':a[--top]=a[top]*a[top+1];break;
                case '/':a[--top]=a[top]/a[top+1];break;
                case '@':cout<<a[top];return 0;//算完两个数再压入栈中,准备之前的操作符运算 
            }s=0;ch=getchar();
        }
    }
}

by 赫敏·东方延绪 @ 2019-07-08 23:45:34

我不知道,反正我开了long long


by XLost @ 2019-07-09 06:45:57

为什么要用快读呢?


by Wen_kr @ 2019-07-09 07:13:45

@Shidai_linzihan

您可能遇到了未定义行为:

a[-- top] = a[top] + a[top + 1]

这句话中关于 "top" 的操作是未定义的

换句话说,这行代码的执行结果取决于编译器,您的电脑上执行的结果可能是 :

a[top - 1] = a[top - 1] + a[top];

这样你的输出会是正确的。

但是在洛谷上这句话执行的结果是

a[top - 1] = a[top] + a[top + 1];

于是在遇到除 0 的时候你就 RE 了,普通的情况你也 WA 了。

差不多就是这样。

把您的代码改为

#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
    int s=0,w=1,top=0,a[1010];
    int ch=getchar();
    for(;;){
        while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();//入栈 
        while(ch<'0'||ch>'9'){
            switch(ch){
                case '.':a[++top]=s;break;
                case '+':top --,a[top]=a[top]+a[top+1];break;
                case '-':top --,a[top]=a[top]-a[top+1];break;
                case '*':top --,a[top]=a[top]*a[top+1];break;
                case '/':top --,a[top]=a[top]/a[top+1];break;
                case '@':cout<<a[top];return 0;//算完两个数再压入栈中,准备之前的操作符运算 
            }s=0;ch=getchar();
        }
    }
}

就能 AC 了


by Shidai_linzihan @ 2019-07-09 09:33:47

@Wen_kr 已经过了,感谢!


by HZAUqzx @ 2019-07-30 19:23:59

@Shidai_linzihan

楼上不对的

$AC.Code
//luogu1499
//后缀表达式
#include <bits/stdc++.h>
int p, s[1001], top;
char cc;
int main(){
    while(true){
        cc = getchar();
        switch(cc){
            case '.': s[++top] = p , p = 0; break;
            case '+': s[--top] += s[top+1]; break;
            case '-': s[--top] -= s[top+1]; break;
            case '*': s[--top] *= s[top+1]; break;
            case '/': s[--top] /= s[top+1]; break;
            case '@': printf("%d", s[top]), exit(0); break;
            default: p = p*10 + cc - '0';
}   }   }

|