呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

数据结构 【实验 串的基本操作】

一、实现主要功能为

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 }

 

Freecode : www.cnblogs.com/yym2013

##原创声明 **转载请注明:[呓语](http://www.yangyingming.com) » [数据结构 【实验 串的基本操作】](http://www.yangyingming.com/article/67)**