#include?#include?#include?#include?#include?#include?#include?#include?#include?#include?#include?#include?#include?using?namespace?std;typedef?long?long?LL;const?int?INF=0x7fffffff;const?int?MAX_N=10000;int?num_of_anum_of_Anum_of_Stotalnum;//小寫字母個數、大寫字母個數、推導式個數、最終結點總數char?a[50];//字母char?S[50][50];//推導式bool?pushed[100];//訪問一個結點的時候,再往外拓展時記錄非終結符是否已經被push過int?ans[100][100];char?analyse[50];//分析串int?stack1[50];char?stack2[50];char?stack3[50];int?L1L2L3;//三個棧的長度mapM;map::iterator?m;struct?node{//結點????int?id;//編號????int?num;//包含的推導式個數????char?s[20][50];};queueq;//結點型隊列node?N[100];int?numN=0;void?outputnd(node?k){//輸出一個結點的s????for(int?i=0;i????????cout<????}}void?outputlb(){//輸出一個數組的s????cout<<“鏈表“<????for(int?i=0;i????????outputnd(N[i]);????????cout<????}}bool?samenode(node?xnode?y){//比較兩個node是否一樣?????if(x.num!=y.num)return?0;//如果兩個node包含的s數量不同直接輸出不同?????for(int?i=0;i????????int?flag=0;????????for(int?j=0;j????????????if(strcmp(x.s[i]y.s[j])==0){????????????????flag=1;????????????????break;????????????}????????}????????if(flag==0)return?0;?????}?????return?1;}void?init(){//初始化????totalnum=0;//結點數量????while(!q.empty())q.pop();//情況隊列????memset(S0sizeof(S));????for(int?i=0;i<100;i++){????????for(int?j=0;j<100;j++){????????????ans[i][j]=-10000;????????}????}????M.clear();//清空映射}void?input(){//顧名思義,輸入數據????printf(“請輸入終結符的個數:“);????scanf(“%d“&num_of_a);????printf(“請輸入%d個終結符(小寫字母):“num_of_a);????for(int?i=0;i????????scanf(“?%c“&a[i]);????????M.insert(make_pair(a[i]i));//建立映射????}????a[num_of_a]=‘#‘;????M.insert(make_pair(a[num_of_a]num_of_a));????printf(“請輸入非終結符的個數(不包含起始符):“);????scanf(“%d“&num_of_A);????printf(“請輸入%d個非終結符(大寫字母):“num_of_A);????for(int?i=0;i????????scanf(“?%c“&a[num_of_a+1+i]);????????M.insert(make_pair(a[num_of_a+1+i]num_of_a+1+i));????}????printf(“請輸入初始推導式的個數:“);????scanf(“%d“&num_of_S);????printf(“下面%d行每行請輸入1個推導式:前后用下劃線“_”鏈接(起始為S):\n“num_of_S);????for(int?i=0;i????????scanf(“%s“S[i]);????????for(int?j=strlen(S[i]);j>=3;j--){????????????S[i][j]=S[i][j-1];????????}????????S[i][2]=‘.‘;????}}node?pushback(char?pnode?f){//node?f里把所有p開頭的推導式push進去????for(int?i=0;i????????if(S[i][0]==p){????????????strcpy(f.s[f.num++]S[i]);????????}????}????return?f;}void?bfs(){//寬度優先搜索????node?aa;//聲明一個空的狀態????aa.num=0;????aa.id=totalnum++;//初始化num和id????aa=pushback(‘S‘aa);//把S開頭的推導式放到這個起始結點里????memset(pushed0sizeof(pushed));//用于記錄哪些字母被一次性push過,避免重復push????for(int?j=0;j????????if(aa
共有 條評論