串的基本操作
一、实现主要功能为:
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\t"); 51 printf("%d\t",i++); 52 for(;i<t.length && i%8;i++){ //输出j 53 printf("%d\t",i); 54 } 55 printf("\n"); 56 printf("next[j]\t"); 57 i=j; 58 printf("%d\t",next[i++]); 59 for(;i<t.length && i%8;i++){ //输出next[j] 60 printf("%d\t",next[i]); 61 } 62 printf("\n\n"); 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\t\t"); 72 printf("%d\t",i++); 73 for(;i<t.length && i%7;i++){ //输出j 74 printf("%d\t",i); 75 } 76 printf("\n"); 77 printf("nextval[j]\t"); 78 i=j; 79 printf("%d\t",nextval[i++]); 80 for(;i<t.length && i%7;i++){ //输出next[j] 81 printf("%d\t",nextval[i]); 82 } 83 printf("\n\n"); 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] 输入目标串\n"); 121 printf("[2] 输入模式串\n"); 122 printf("[3] 输出模式串的next数组\n"); 123 printf("[4] 输出模式串的nextval数组\n"); 124 printf("[5] 使用next[]进行匹配\n"); 125 printf("[6] 使用nextval[]进行匹配\n"); 126 printf("[0] 按其他键退出\n"); 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[]生成成功!\n"); 143 GetNextval(t,nextval); 144 printf("nextval[]生成成功!\n\n"); 145 break; 146 case 3: //输出模式串的next数组 147 if(next[0]==0){ 148 printf("您还没有输入模式串!\n\n"); 149 break; 150 } 151 printNext(t,next); 152 break; 153 case 4: //输出模式串的nextval数组 154 if(next[0]==0){ 155 printf("您还没有输入模式串!\n\n"); 156 break; 157 } 158 printNextval(t,nextval); 159 break; 160 case 5: //使用next[]进行匹配 161 if(s.data[0]=='\0'){ 162 printf("您还没有输入目标串!无法匹配!\n\n"); 163 break; 164 } 165 if(next[0]==0){ 166 printf("您还没有输入模式串!\n\n"); 167 break; 168 } 169 in = KMPIndex1(s,t,next); 170 if(in==-1) 171 printf("匹配失败!\n\n"); 172 else { 173 printf("使用next数组匹配成功!匹配位置为:%d\n",in); 174 printf("匹配情况如下:\n"); 175 printf("%s\n",s.data); 176 while(in--) 177 printf(" "); 178 printf("%s\n\n",t.data); 179 } 180 break; 181 case 6: //使用nextval[]进行匹配 182 if(s.data[0]=='\0'){ 183 printf("您还没有输入目标串!无法匹配!\n\n"); 184 break; 185 } 186 if(next[0]==0){ 187 printf("您还没有输入模式串!\n\n"); 188 break; 189 } 190 in = KMPIndex2(s,t,nextval); 191 if(in==-1) 192 printf("匹配失败!\n\n"); 193 else { 194 printf("使用nextval数组匹配成功!匹配位置为:%d\n",in); 195 printf("匹配情况如下:\n"); 196 printf("%s\n",s.data); 197 while(in--) 198 printf(" "); 199 printf("%s\n\n",t.data); 200 } 201 break; 202 default: 203 exit(1); 204 } 205 system("pause"); 206 system("cls"); 207 } 208 209 int main() 210 { 211 int next[MAXSIZE+1]={0},nextval[MAXSIZE+1]={0}; 212 SqString s={0},t={0}; 213 while(1){ 214 int in = Menu(); 215 Reply(s,t,next,nextval,in); 216 } 217 return 0; 218 }