参考书籍
《数据结构》(C语言版 第2版)—— 严蔚敏 李冬梅 吴伟民 编著
程序应用
给出模式串即可得出next数组和nextval数组
代码段
#include<iostream>
#include<cstring>
//需用到strlen()函数求模式串的长度
using namespace std;
char pattern[99999];//模式串数组
int ne[99999]; //next数组
int nextval[99999];//nextval数组
int length; //模式串的长度
void get_next(char pat[],int nex[],int l)//求next数组
{
int i=1,j=0;
nex[1]=0;
while(i<l)
{
if(j==0 || pat[i]==pat[j])
{
++i; ++j;
nex[i]=j;
}
else j=nex[j];
}
}
void get_nextval(char pat[],int nexval[],int l)//求nextval数组
{
int i=1,j=0;
nexval[1]=0;
while(i<l)
{
if(j==0 || pat[i]==pat[j])
{
++i; ++j;
if(pat[i] != pat[j]) nexval[i]=j;
else nexval[i]=nexval[j];
}
else j=nexval[j];
}
}
int main()
{
while(true)//可以一次运行,测试无数次数据(当然是个死循环)
{
cout<<"请输入模式串:"<<endl;
cin>>pattern+1;
length = strlen(pattern+1);
//注意!此处是将模式串从下标为1处开始存储,所以使用pattern+1
//调用get_next()函数求next数组
get_next(pattern,ne,length);
cout<<"模式串的next数组为:"<<endl;
for(int i=1;i<=length;i++)
cout<<ne[i]<<" ";
cout<<endl;
//调用get_nextval()函数求nextval数组
get_nextval(pattern,nextval,length);
cout<<"模式串的nextval数组为:"<<endl;
for(int i=1;i<=length;i++)
cout<<nextval[i]<<" ";
cout<<endl<<endl;
}
return 0;
}
效果展示