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

一、实现主要功能为

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于定长顺序存储结构实现对的赋值、比较、求子的位置、替换等操作。要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符的第一个元素存放的是该字符的长度(不包括第一个元素),除的赋值外,其他所有操作(比较、求子的位置、替换)等都不应包含该字符。 1.1.实验1:赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其中待赋值数组StrTobeAssigned[0]存放有效数据的长度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符变量StrTobeAssigned,字符的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的长度,并返回1; ⑤ 假设: a)两个字符均不为空; b)StrInput存放的是一个完成的字符(不包含长度); c)赞不考虑输入数据超过数组总长度的情况。 1.2实验2:替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主中MainStr查找是否存在某特定子SubStr1,若存在则将所有的SubStr1替换为新的指定子SubStr2,函数返回字符替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主变量MainStr,子变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主中存在子,用SubStr2替换主MainStr中出现的所有与SubStr1相同的不重叠的子,并返回字符替换的次数;否则返回0。 ⑤ 假设: a)主和两个子均不为空; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符的长度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现的赋值操作,主要的思路包括: (a)获得输入字符的长度len; (b)将输入字符的长度len赋值给待赋值字符的第一个元素StrTobeAssigned[0]; (c)依次将输入字符的数据赋值给待赋值字符。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现的替换操作,主要的思路包括: (a)遍历主MainStr,检查是否存在某特定子SubStr1; (b)如果存在则找到子在主中的位置; (c)在主中删除该子并更新主长度; (d)在主中插入该子并更新主长度; (e)过程中记录替换字符的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:求子位置的函数MySubStrIndex(),子删除函数MyStrDelete()和子插入函数MyStrInsert()等

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值