1260 文法语言

来源:互联网 发布:java捕获sql异常 编辑:程序博客网 时间:2024/04/28 12:24
 
描述

一个文法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".

样例输入
2abcsdf324sdad(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;}


 

原创粉丝点击