一、实现主要功能为

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

转载于:https://www.cnblogs.com/yym2013/p/3793273.html

数据结构 【实验 串的基本操作】相关推荐

  1. 数据结构实验 二叉树的基本操作

    数据结构实验 二叉树的基本操作 实验环境: Visual C++ 实验目的: 1.掌握二叉树的定义: 2.掌握二叉树的基本操作,如二叉树的建立.遍历.结点个数统计.树的深 度计算等. 实验内容: 用递 ...

  2. 数据结构实验——串的加密

    一.实验题目 一个文本串可用事先给定的字母映射表进行加密.例如,设字母映射表为: abcdefghijklmnopqrstuvwxyz ngzqtcobmuhelkpdawxfyivrsj 则字符串& ...

  3. 数据结构 实验六 图基本操作的编程实现

    [实验目的] 图基本操作的编程实现 要求: 图基本操作的编程实现(2学时,验证型),掌握图的建立.遍历.插入.删除等基本操作的编程实现,存储结构可以在顺序结构.链接结构.联合使用多种结构等中任选,也可 ...

  4. C++数据结构实验--图的基本操作

    实验四 图的基本操作 1.实验内容与要求 理解邻接矩阵和邻接表的概念 任选一种存储方式实现以下操作:图的构造.深度优先遍历以及广度优先遍历 选作:最小生成树和最短路径. 2.实验环境 硬件环境:计算机 ...

  5. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  6. 图的基本操作实现(数据结构实验)

    实验项目六 图结构基本操作的实现 课程名称:数据结构 实验项目名称:图结构基本操作的实现 实验目的: 1.掌握图的基本操作-遍历. 实验要求: 1.    分别用DFS和BFS的方法实现一个无向图的遍 ...

  7. 数据结构 【实验7 二叉树基本操作】

    实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法 ...

  8. python数据结构实验目的_图的基本操作实现(数据结构实验)

    课程名称:数据结构 实验项目名称:图结构基本操作的实现 实验目的: 1.掌握图的基本操作-遍历. 实验要求: 1. 分别用DFS和BFS的方法实现一个无向图的遍历. 实验过程: 1. 创建一个图(可用 ...

  9. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

最新文章

  1. ORACLE日期加减【转】
  2. Mybatis使用时因jdbcType类型大小写书写不规范导致的异常
  3. React拾遗:Render Props及其使用场景
  4. android世界时钟代码大全,世界时钟精美时钟代码
  5. module是什么类型_Linux驱动开发:为什么教程都不讲MODULE_DEVICE_TABLE的作用
  6. 2021年慈溪横河中学高考成绩查询,慈溪中学
  7. 官司缠身!马斯克和特斯拉目前面临数十起诉讼和调查
  8. 【转载】推荐5款超实用的.NET性能分析工具
  9. html blob处理图片,将Blob图像预览为HTML5
  10. 雷林鹏分享:Lua break 语句
  11. 如何在 Ubuntu 中安装和删除软件
  12. 重装服务器,解决怪问题
  13. ESP8266+安信可微信智能配网
  14. TeamCenter怎样删除已发布物料
  15. 编程比赛项目和时间汇总
  16. 宏基因组分析步骤Linux,宏基因组--简单流程(代码)
  17. ILRuntime学习(之一)
  18. 使用burpsuit工具进行sql盲注入
  19. 几种常用方法教你解决QQ空间无法打开问题
  20. MACOS聚焦搜索无法搜索相应的软件和文件等,解决办法

热门文章

  1. IM系统中聊天记录模块的设计与实现
  2. 查看是否存在DDOS*** netstat
  3. nfs挂载hdfs,实现云存储
  4. Scaling For iPad mini
  5. OpenJudge 2972(确定进制)
  6. magento 安装出错 完全解决方案
  7. [转] Asp.net mvc 3 beta 新特性介绍
  8. python 多线程就这么简单(续)
  9. 蓝桥杯 ALGO-99 算法训练 薪水计算
  10. CCCC-GPLT L1-035. 情人节 团体程序设计天梯赛