#6171: 請問一下為何會RE


jimmyee (LEVEL_UP)

學校 : 國立臺灣大學
編號 : 20170
來源 : [140.112.42.92]
最後登入時間 :
2016-03-18 15:33:33
a017. 五則運算 | From: [140.112.242.128] | 發表日期 : 2011-12-16 16:11

#include<iostream>
#include<cstdio>
#define size 1000
using namespace std;

inline short order(char s)
{
    if(s=='(')
        return 0;
    else if(s==')')
        return 1;
    else if(s=='+'||s=='-')
        return 2;
    else if(s=='*'||s=='/'||s=='%')
        return 3;
}

inline bool sym(char s)
{
    if(s=='+'||s=='-'||s=='*'||s=='/'||s=='('||s==')'||s=='%')
        return 1;
    else return 0;
}

void convert(char in[],char s[])
{
    int i,ps,pn;
    char temps[size];
    for(i=0;i<size;i++)
        temps[i]=s[i]=0;
    for(ps=0,pn=0,i=0;in[i]!=0;i++)
    {
        if(sym(in[i]))
        {
            s[pn++]=' ';
            temps[ps]=in[i];
            while(ps && order(temps[ps]) && order(temps[ps])<=order(temps[ps-1]) )
            {
                if(temps[ps]!=')')
                {
                    s[pn++]=temps[ps-1];
                    s[pn++]=' ';
                    temps[ps-1]=temps[ps--];
                }
                else
                {
                    while(ps--)
                        if(temps[ps]!='(')
                        {
                            s[pn++]=temps[ps];
                            s[pn++]=' ';
                        }
                }
            }
            ps++;
        }
        else if(in[i]==' ');
        else
        {
            s[pn++]=in[i];
        }
    }
    for(ps--;ps>=0;ps--)
    {
        s[pn++]=' ';
        s[pn++]=temps[ps];
    }
}

void count(char s[],long long num[])
{
    int i,k;
    k=0;
    for(i=0;i<100;i++)
        num[i]=0;
    for(i=0;;i++)
    {
        if(s[i]==0)
            break;
        else if(s[i]>='0'&&s[i]<='9')
            num[k]=num[k]*10+s[i]-'0';
        else if(s[i]==' '&&s[i-1]>='0'&&s[i-1]<='9')
            k++;
        else if(s[i]=='+')
        {
            num[k-2]+=num[k-1];
            num[k-1]=0;
            k--;
        }
        else if(s[i]=='-')
        {
            num[k-2]-=num[k-1];
            num[k-1]=0;
            k--;
        }
        else if(s[i]=='*')
        {
            num[k-2]*=num[k-1];
            num[k-1]=0;
            k--;
        }
        else if(s[i]=='/')
        {
            num[k-2]/=num[k-1];
            num[k-1]=0;
            k--;
        }
        else if(s[i]=='%')
        {
            num[k-2]%=num[k-1];
            num[k-1]=0;
            k--;
        }
    }
}

int main()
{
    char in[size],result[10*size];
    long long n[size];
    while(gets(in))
    {
        convert(in,result);
        count(result,n);
        cout << n[0] << endl;
    }
}


以上是程式碼

先把中置轉後置,再算後續運算,實在不知道問題出在哪兒

 
ZeroJudge Forum