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