首页 > 代码库 > 数据结构 【实验 串的基本操作】
数据结构 【实验 串的基本操作】
一、实现主要功能为:
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 else109 j = nextval[j];110 }111 if(j>=t.length)112 return i-t.length;113 else114 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 }
Freecode : www.cnblogs.com/yym2013
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。