一、实现主要功能为:
1、输入模式串、目标串
2、根据目标串生成next[]和nextval[]数组
3、根据next[]或者nextval[]进行匹配。
二、程序截图:
三、代码:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 #define MAXSIZE 1000 //最大字符数 8 9 struct SqString{ //定义顺序串结构 10 char data[MAXSIZE]; 11 int length; 12 }; 13 14 void GetNext(SqString t,int next[]) //求出模式串t的next数组 15 { 16 int j,k; 17 j=0,k=-1;next[0] = -1; 18 while(j<t.length-1){ 19 if(k==-1 || t.data[j]==t.data[k]){ 20 j++,k++; 21 next[j] = k; 22 } 23 else 24 k = next[k]; 25 } 26 } 27 28 void GetNextval(SqString t,int nextval[]) //求出模式串t的valnext数组 29 { 30 int j,k; 31 j=0,k=-1;nextval[0]=-1; 32 while(j<t.length){ 33 if(k==-1 || t.data[j]==t.data[k]){ 34 j++;k++; 35 if(t.data[j]!=t.data[k]) 36 nextval[j] = k; 37 else 38 nextval[j] = nextval[k]; 39 } 40 else 41 k = nextval[k]; 42 } 43 } 44 45 void printNext(SqString t,int next[]) //输出next数组 46 { 47 int i=0; 48 while(i<t.length){ //分段输出,每段8个数据 49 int j=i; 50 printf("j "); 51 printf("%d ",i++); 52 for(;i<t.length && i%8;i++){ //输出j 53 printf("%d ",i); 54 } 55 printf(" "); 56 printf("next[j] "); 57 i=j; 58 printf("%d ",next[i++]); 59 for(;i<t.length && i%8;i++){ //输出next[j] 60 printf("%d ",next[i]); 61 } 62 printf(" "); 63 } 64 } 65 66 void printNextval(SqString t,int nextval[]) //输出nextval数组 67 { 68 int i=0; 69 while(i<t.length){ //分段输出,每段7个数据 70 int j=i; 71 printf("j "); 72 printf("%d ",i++); 73 for(;i<t.length && i%7;i++){ //输出j 74 printf("%d ",i); 75 } 76 printf(" "); 77 printf("nextval[j] "); 78 i=j; 79 printf("%d ",nextval[i++]); 80 for(;i<t.length && i%7;i++){ //输出next[j] 81 printf("%d ",nextval[i]); 82 } 83 printf(" "); 84 } 85 } 86 87 int KMPIndex1(SqString s,SqString t,int next[]) 88 { 89 int i=0,j=0; 90 while(i<s.length && j<t.length){ 91 if(j==-1 || s.data[i]==t.data[j]) 92 i++,j++; 93 else 94 j=next[j]; 95 } 96 if(j>=t.length) 97 return i-t.length; 98 else 99 return -1; 100 } 101 102 int KMPIndex2(SqString s,SqString t,int nextval[]) 103 { 104 int i=0,j=0; 105 while(i<s.length && j<t.length){ 106 if(j==-1 || s.data[i]==t.data[j]) 107 i++,j++; 108 else 109 j = nextval[j]; 110 } 111 if(j>=t.length) 112 return i-t.length; 113 else 114 return -1; 115 } 116 117 int Menu() //操作菜单 118 { 119 int in; 120 printf("[1] 输入目标串 "); 121 printf("[2] 输入模式串 "); 122 printf("[3] 输出模式串的next数组 "); 123 printf("[4] 输出模式串的nextval数组 "); 124 printf("[5] 使用next[]进行匹配 "); 125 printf("[6] 使用nextval[]进行匹配 "); 126 printf("[0] 按其他键退出 "); 127 scanf("%d",&in); 128 return in; 129 } 130 131 void Reply(SqString &s,SqString &t,int next[],int nextval[],int in) //对菜单的选项进行应答 132 { 133 switch(in){ 134 case 1: //输入目标串 135 scanf("%s",s.data); 136 s.length = strlen(s.data); 137 break; 138 case 2: //输入模式串 139 scanf("%s",t.data); 140 t.length = strlen(t.data); 141 GetNext(t,next); 142 printf("next[]生成成功! "); 143 GetNextval(t,nextval); 144 printf("nextval[]生成成功! "); 145 break; 146 case 3: //输出模式串的next数组 147 if(next[0]==0){ 148 printf("您还没有输入模式串! "); 149 break; 150 } 151 printNext(t,next); 152 break; 153 case 4: //输出模式串的nextval数组 154 if(next[0]==0){ 155 printf("您还没有输入模式串! "); 156 break; 157 } 158 printNextval(t,nextval); 159 break; 160 case 5: //使用next[]进行匹配 161 if(s.data[0]=='