SDUT 2560 又见回文

Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。
Input
有多组输入,每行输入一串字符,保证字符串长度不会大于 100000,字符串由大小写英文字母和空格组成,以字符串“2013”作为结束标志。
Output
每行输出一个字符串,如果输入是回文串,输出“YES”,否则输出“NO”(注意:判断的时候空格是不作判断的,详见样例)。
Sample Input
aaaa
ggg g
lozxvxoMJBCHsTXooXTsHCBJMoxvxzol
i am a good acmer
2013
Sample Output
YES
YES
YES
NO
Hint
Source
fenggang

注:使用scanf(“%s”)输入字符时,以空格或回车作为输入的结束标志。
使用gets()输入字符,只以回车作为结束标志。
此题中所给字符可包含空格,故使用gets()输入字符。

#include 
#include 
#include 

char q[100005]; //int main()
{
    char a[100005];
    int i,top,len;
    while(gets(a)!=EOF) //字符串内包含空格,使用gets输入字符
    {
        if(strcmp(a,"2013")==0)
            break;
        top=0;
        len=strlen(a);
        for(i=0;iif(a[i]!=' ') //字符串中,不为空格则入栈
            q[top++]=a[i];
        }
        for(i=0;iif(q[top-1]==a[i])
            top--;
        if(top==0) //匹配成功
            printf("YES\n");
        else       //匹配失败
            printf("NO\n");
    }
    return 0;
}

解法二:

#include 
#include 
#include 

int main()
{
    char a[100005],b[100005];
    int i,len,s,flag;
    while(gets(a)!=EOF)
    {
        s=0;
        flag=0;
        if(strcmp(a,"2013")==0)
            break;
        len=strlen(a);
        for(i=0; iif(a[i]!=' ')
            {
                s++;
                b[s]=a[i];
            }
        }
        for(i=1; i<=s/2; i++) //字符串的前半部分和后半部分依次进行比较
        {
            if(b[i]!=b[s+1-i])
                break;
        }
        if(i==s/2+1) //匹配成功
            flag=1;
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

你可能感兴趣的:(栈)