蒟蒻有个问题求问!

P1449 后缀表达式

Sakura_Peng @ 2017-12-07 21:55:00

很简单的思路,但是在程序实现上出现了问题。

#include <stdio.h>
int main()
{
    int a[1001]={0},top=0;
    char ch;
    while((ch=getchar()) !='@')
    {
        if(ch>='0' && ch<='9')
        {
               a[++top]=ch-'0';
        while((ch=getchar())>='0' && ch<='9')
        {
            //printf("!!!!!!!\n");
            a[top]=a[top]*10+ch-'0';
        } 
        }
        switch(ch)
        {
                case '-':a[--top]-=a[top+1];break;
                case '+':a[--top]+=a[top+1];break;
                case '/':a[--top]/=a[top+1];break;
                case '*':a[--top]*=a[top+1];break;
        }
    }
    printf("%d",a[top]);
    return 0;
}

所有的问题都是输入的问题,我之前用的是scanf("%c",&ch),并且不是在while括号内,而是在循环体里面写,一直死循环,调了好长时间,都没发现,最后没办法看了一下题解最下面的,发现在括号里写AC了,然后我便改成了while(scanf("%c",&ch)!='@'),但是依旧是死循环,也调了半小时左右也不行,最后被迫跟题解一样,改成了while(ch=getchar()!='@')这时候不死循环了,为什么?? 但是!如果如上写答案一直是0,这时我又调了好长时间,最后无奈还是看了看题解,发现外面括了一个括号while((ch=getchar())!='@')加上之后便样例过了,而且A了。真的不知道怎么回事,求大佬告诉我!


by Altria_Pendragon_ @ 2017-12-08 12:31:45

scanf("%c",ch)的返回值是读取到的数据的个数,肯定要返回int类型。int类型和char类型,肯定不相等,所以scanf("%c",&ch)!='@'一直为true,所以会死循环咯

附上ACcode:

#include <bits/stdc++.h>
using namespace std;
int s[1001],len=0;
void readint(){
    int tmp=0;
    while (1){
        char c;
        c=getchar();
        if (c=='@') return;
        if ((c>='0')&&(c<='9')){tmp*=10; tmp+=c-48; continue;}
        if (c=='.'){len++;s[len]=tmp;tmp=0;continue;}
        if (c=='+'){s[len-1]+=s[len];len--;s[len+1]=0;continue;}
        if (c=='*'){s[len-1]*=s[len];len--;s[len+1]=0;continue;}
        if (c=='-'){s[len-1]-=s[len];len--;s[len+1]=0;continue;}
        if (c=='/'){s[len-1]/=s[len];len--;s[len+1]=0;continue;}
    }
}
int main(){
    readint();
    cout<<s[1]<<endl;
    return 0;
}

恕我吐槽一下,都综应班了还问c++语言问题


|