数据结构实验四:串基本操作的实现

课程名称:数据结构

实验项目名称:串基本操作的实现

实验目的:

1.掌握串的模式匹配操作。

实验要求:

1、    分别使用BF和KMP算法完成串的模式匹配。

实验过程:

BF算法代码;;

1、    设计完成next值的计算函数;

2、    设计完成修正next值的函数;

3、    KMP算法代码;

4、    输入子串(aaac)和主串(aaabaaaaaac)

5、    输出子串在主串中开始的位置及不同算法比较的次数。

此部分实验报告中给出BF,next,修正next,KMP的代码。

实验结果:

输入: 子串:aaac; 主串:aaabaaaaaac

输出:BF,KMP,改进的KMP三种算法分别比较的次数及查找到的子串在主串中的位置。

   例:

   BF比较??次       子串位置:8

   KMP比较??次       子串位置:8

   改进KMP比较??次    子串位置:8

实验分析:

1.普通next和修正next的区别;

2.列举调试运行过程中出现的错误并分析原因。

要求:

(1) 程序要添加适当的注释,程序的书写要采用缩进格式

(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。

(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4) 上传源程序到课堂派。顺序表的源程序保存为Stringindex.cpp

#include<iostream>
using namespace std;
 
void Get_next(string T, int next[])//next
{
	int i=0;
	next[0]=-1;
	int j=-1;
	while(i < T.size())
	{
		if(j == -1 || T[i] == T[j])
		{
			++i;
			++j;
			next[i]=j;
		}
		else j=next[j];
	}
}
 
void Get_nextval(string T, int nextval[])//修正next 
{
	int i=0;
	nextval[0]=-1;
	int j=-1;
	while(i < T.size())
	{
		if(j == -1 || T[i] == T[j])
		{
			++i;
			++j;
			if(T[i] != T[j]) nextval[i]=j;
			else nextval[i]=nextval[j];
		}
		else j=nextval[j];
	}
}
 
void Index_BF(string S, string T)
{
	int i=0;
	int j=0;
	int cnt=0;
	while(i<(int)S.size() && j<(int)T.size())
	{
		if(S[i] == T[j])
		{
			++i;
			++j;
		}
		else 
		{
			i=i-j+1;
			j=0;
		}
		cnt++; 
	} 
	if(j >=(int)T.size()) 
	{
		printf("BF比较%d次   子串位置: %d\n",cnt,i-(int)T.size()+1);
	}
	else puts("匹配失败"); 
}
 
void Index_KMP1(string S, string T, int next[])
{
	int cnt=0;
	int i=0;
	int j=0;
	while(i < (int)S.size() && j < (int)T.size())
	{
		if(j == -1 || S[i] == T[j])
		{
			++i;
			++j;	
		}	
		else j=next[j];
		cnt++;
	}	
	if(j == (int)T.size()) 
	{
		printf("KMP比较%d次   子串位置: %d\n",cnt,i-(int)T.size()+1);
	}
	else puts("匹配失败");
	
} 
 
void Index_KMP2(string S, string T, int next[])
{
	int cnt=0;
	int i=0;
	int j=0;
	while(i < (int)S.size() && j < (int)T.size())
	{
		if(j == -1 || S[i] == T[j])
		{
			++i;
			++j;	
		}	
		else j=next[j];
		cnt++;
	}	
	if(j == (int)T.size()) 
	{
		printf("改进KMP比较%d次   子串位置: %d\n",cnt,i-(int)T.size()+1);
	}
	else puts("匹配失败");
	
} 
 
int main()
{
	int next[1000];
	int nextval[1000];
	puts("请输入主串"); 
	string S;//主串
	cin>>S;
	puts("请输入子串"); 
	string T;//子串
	cin>>T;
	Index_BF(S,T);
	Get_next(T,next);//next
	Index_KMP1(S,T,next);
	Get_nextval(T,nextval);//修正next 
	Index_KMP2(S,T,nextval);
	return 0;
}

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值