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

一、实现主要功能为

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

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

时间: 2024-12-18 15:38:13

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

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

SDUT 2772 数据结构实验之串一:KMP简单应用

数据结构实验之串一:KMP简单应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两个字符串string1和string2,判断string2是否为string1的子串. Input 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格. Outp

SDUT 3311 数据结构实验之串三:KMP应用

数据结构实验之串三:KMP应用 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n.现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数? Input 首先输入一个整数n,代表有n个小朋友.下一行输入n个数,分别代表每个小朋友手里糖的数量. 之后再输

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

实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 实验内容 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作.该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数. /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct Bit

SDUT-2772_数据结构实验之串一:KMP简单应用

数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定两个字符串string1和string2,判断string2是否为string1的子串. Input 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格. Output 对于每组输入数据,若s

数据结构实验之串三:KMP应用

C - 数据结构实验之串三:KMP应用 Description 有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n.现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数? Input 首先输入一个整数n,代表有n个小朋友.下一行输入n个数,分别代表每个小朋友手里糖的数量. 之后再输入一个整数m,代表下面有m个数.下一行输入这m个数. Output 如果能唯一的确定一对l,r的值,那么输出这两个值,否则输

数据结构实验之串三:KMP应用(KMP模板)

数据结构实验之串三:KMP应用(KMP模板) AC_Code: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <map> 6 #include <stack> 7 using namespace std; 8 typedef long long ll; 9 int Nex[1000000]; 10

数据机构实验报告-实验三 二叉树基本操作的实现

实验三   二叉树基本操作的实现   l  实验目的 1.二叉树的基本操作 (1)掌握二叉树链表的结构和二叉排序树的建立过程. (2)掌握二叉树排序树的插入和删除操作. (3)加深对二叉树的理解,逐步培养解决实际问题的编程能力. 2.树的遍历和哈夫曼树 (1)掌握用递归方法实现二叉树遍历的操作. (2)掌握用非递归方法实现二叉树遍历的操作. (3)掌握建立Huffman树的操作. (4)加深对二叉树的理解,逐步培养解决实际问题的编程能力. l  实验内容 1.二叉树的基本操作 (一)基础题 (1

数据结构实验之栈四:括号匹配(栈)

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出"yes",不匹配输出"no" 示例输入 sin(20+10) {[}] 示例输出 yes no 提示 来源 ma6174