- 描述
-
一个文法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; }