数据结构串的实现以及KMP改进算法

2024-09-03 13:48

本文主要是介绍数据结构串的实现以及KMP改进算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

</pre><pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 40 /* 存储空间初始分配量 */
typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char String[MAXSIZE+1]; /*  0号单元存放串的长度 */
/*  输出字符串T */
void StrPrint(String T)
{int i;for(i=1;i<=T[0];i++)printf("%c",T[i]);printf("\n");
}
/* 生成一个其值等于chars的串T */
Status StrAssign(String T,char *chars)
{int i;if(strlen(chars)>MAXSIZE)return ERROR;else{T[0]=strlen(chars);//T[0]存储串的长度for(i=1;i<=T[0];i++)T[i]=*(chars+i-1);return OK;}
}
/* 返回串的元素个数 */
int StrLength(String S)
{return S[0];
}/*  初始条件: 串S和T存在 */
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */
int StrCompare(String S,String T)
{int i;for(i=1;i <=S[0]&&i<=T[0];++i)if(S[i]!=T[i])return S[i]-T[i];return S[0]-T[0];
}/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{int i;if(S1[0]+S2[0]<=MAXSIZE){ /*  未截断 */for(i=1;i<=S1[0];i++)T[i]=S1[i];for(i=1;i<=S2[0];i++)T[S1[0]+i]=S2[i];T[0]=S1[0]+S2[0];return TRUE;}else{ /*  截断S2 */for(i=1;i<=S1[0];i++)T[i]=S1[i];for(i=1;i<=MAXSIZE-S1[0];i++)T[S1[0]+i]=S2[i];T[0]=MAXSIZE;return FALSE;}
}/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{int i;if(pos < 1||pos>S[0]||len < 0||len>S[0]-pos+1)return ERROR;for(i=1;i<=len;i++)Sub[i]=S[pos+i-1];Sub[0]=len;return OK;
}
void get_next(String T,int *next)
{int i,j;i=1;j=0;next[1]=0;while(i<T[0]){if(j==0||T[i]==T[j]){i++;j++;next[i]=j;}else{j=next[j];}}
}
void get_nextval(String T,int *nextval)
{int i,j;i=1;j=0;nextval[1]=0;while(i<T[0]){if(j==0||T[i]==T[j]){i++;j++;if(j==0||T[i]!=T[j])nextval[i]=j;elsenextval[i]=nextval[j];}else{j=nextval[j];}}
}
int Index_KMP(String S,String T,int pos)
{int i=pos;//从pos位置开始int j=1;int next[255];//定义一组next数组//get_next(T,next);get_nextval(T,next);while(i<=S[0]&&j<=T[0]){if(j==0||S[i]==T[j]){++i;++j;}else{j=next[j];}}if(j>T[0]){return i-T[0];}elsereturn 0;
}
int main()
{String S,T;char *s="acdefgab";char *t="ab";StrAssign(S,s);StrAssign(T,t);int a= Index_KMP(S,T,1);printf("%d",a);return 0;
}


这篇关于数据结构串的实现以及KMP改进算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133134

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ