现在的位置: 首页 > 综合 > 正文

1260 文法语言

2012年10月23日 ⁄ 综合 ⁄ 共 893字 ⁄ 字号 评论关闭
 
描述

一个文法G[Z]有如下五条规则:
(1)Z→(U)
(2)Z→aUb
(3)U→dZ
(4)U→bU
(5)U→e
由此文法可以产生语言:比如:ad(be)b就是此文法的语言,因为有如下推导序列:
Z→aUb→adZb→ad(U)b→ad(bU)b→ad(be)b

输入

有n+1行,第一行为测试数据的组数n。 下面有n行,每行为一个字符串。

输出

对每一组测试数据有一行输出,如果语言Σ是G[Z]产生的语言,则输出"Yes."如果不是则 输出"No".

样例输入
2
abcsdf324sd
ad(be)b
样例输出
No.
Yes.
提示

运用递归。

 

按照提示递归实现即可

#include <stdio.h>
#include <string.h>
char s[10001];
int i;
int flag;
int flag1;
void U();
void Z();
void Z()
{
    if(s[i]=='(')
    { 
        i++;
        U();
        if(s[i]==')')
        {
            i++;
        }
        else
            flag=1;
    }

    else if(s[i]=='a')

    {
        i++;
        U();
        if(s[i]=='b')
            i++;
        else
            flag=1;
    }
    else
        flag=1;
}
void U()
{

    if(s[i]=='d')
    {
        i++;
        Z();
    }
    else if(s[i]=='b'&&s[i+1]!='\0')
    {
        i++;
        U();
    }
    else if(s[i]=='e')
    { 
        i++;
    }
    else
        flag=1;
}
int main()
{
    int t,number,j;
    int length;
    scanf("%d",&number);
    for(t=1;t<=number;t++)
    {
        i=0;
        flag=0;
        scanf("%s",&s);
        length=strlen(s);

        for ( j=0;j<strlen(s);j++)
        {
            if (s[j]!='e'&&s[j]!='a'&&s[j]!='b'&&s[j]!='d'&&s[j]!='('&&s[j]!=')')

            {
                flag=1;
                break;
            } 
        }
        if(flag==0)

            Z();

        if(flag==0)
            printf("Yes.\n");

        else

            printf("No.\n");
    }
    return 0;
}

 

抱歉!评论已关闭.