实验项目四 串基本操作的实现
课程名称:数据结构
实验项目名称:串基本操作的实现
实验目的:
1.掌握串的模式匹配操作。
实验要求:
1、 分别使用BF和KMP算法完成串的模式匹配。
实验过程:
1、 设计完成next值的计算函数;
2、 设计完成修正next值的函数;
3、 KMP算法代码;
4、 输入子串(abbc)和主串(abbabbcad)
5、 输出子串在主串中开始的位置。
实验报告中给出next,修正next,KMP及主函数的代码。
实验结果:
输入: 子串:abbc; 主串:abbabbcad
输出:4
实验分析:
1.普通next和修正next的区别;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为Stringindex.cpp。
程序代码:
// Test.cpp : Defines the entry point for the console application. // //#include "stdafx.h" #include <stdio.h> #include "stdlib.h" #include <iostream> using namespace std; //宏定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define MAXSTRLEN 100 typedef char SString[MAXSTRLEN + 1]; void GetNext(SString T, int next[]); int KMPindex(SString S, SString T, int pos); /************************************************************************/ /* 返回子串T在主串S中第pos位置之后的位置,若不存在,返回0 */ /************************************************************************/ int KMPindex(SString S, SString T, int pos) { if (pos <1 || pos > S[0] ) exit(ERROR); int i = pos, j =1; int next[MAXSTRLEN]; GetNext( T, next); while (i<= S[0] && j <= T[0]) { if (S[i] == T[j]) { ++i; ++j; } else { j = next[j]; } } if(j > T[0]) return i - T[0]; return ERROR; } /************************************************************************/ /* 求子串next[i]值的算法 */ /************************************************************************/ void GetNext(SString T, int next[]) { int j = 1, k = 0; next[1] = 0; while(j < T[0]){ if(k == 0 || T[j]==T[k]) { ++j; ++k; next[j] = k; } else { k = next[k]; } } } int main(){ SString S = {9,'a','b','b','a','b','b','c','a','d'}; SString T = {4,'a','b','b','c'}; int pos; pos = KMPindex( S, T, 1); cout<<"Pos:"<<pos; }