3.1 串的基本概念

数据对象为字符集的线性表

3.2 串的存储实现

3.2.1 定长顺序串
	类似顺序表
#define MAXSIZE 40
typedef struct{
	char  ch[MAXSIZE];
	int len;
}SString;
//串插入
int StrInsert(SString *s,int pos,SString t)
{
	int i;
	if(pos<0||pos>s->len)	return 0;
	if(s->len+t.len<=MAXSIZE)
	{
		for(i=s->len+t.len-1;i>=pos+t.len;i--)
			s->ch[i]=s->ch[i-t.len];
		for(i=pos;i<pos+t.len;i++)
			s->ch[i]=t.ch[i-pos];
		s->len=s->len+t.len;
	}
	else if(pos+t.len<=MAXSIZE)
	{
		for(i=MAXSIZE-1;i>=pos+t.len;i--)
			s->ch[i]=s->ch[i-t.len];
		for(i=pos;i<pos+t.len;i++)
			s->ch[i]=t.ch[i-pos];
		s->len=MAXSIZE;
	}
	else 
	{
		for(i=pos;i<MAXSIZE;i++)
			s->ch[i]=t.ch[i-pos];
		s->len=MAXSIZE;
	}
	return 1;
}
//串删除
int StrDelete(SString *s,int pos,int len)
{
	int i;
	if(pos <0||pos>(s->len-len))	return(0);
	for(i=pos+len;i<s->len-len;i++)
		s->ch[i-len]=s->ch[i];
	s->len=s->len-len;
	return(1);
}
//串比较
int StrCompare(SString s,SString t)
{
	int i;
	for(i=0;i<s.len && i<t.len;i++)
		if(s.ch[i]!=t.ch[i])	return(s.ch[i]-t.ch[i]);
	return (s.len-t.len);
} 
3.2.2 堆串
typedef struct{
	char *ch;
	int len;
}HString;
int StrInsert(HString *s,int pos,HString *t)//堆串插入函数 
{
	int i;
	char * temp;
	if(pos<0 ||pos>s->len)	return 0;
	temp=(char*)malloc(s->len+t->len);
	if(temp==NULL)	return 0;
	for(i=0;i<pos;i++)	temp[i]=s->ch[i];
	for(i=0;i<t->len;i++)	temp[i+pos]=t->ch[i];
	for(i=pos;i<s->len;i++)	temp[i+t->len]=s->ch[i];
	s->len+=t->len;
	free(s->ch);
	s->ch=temp;
	return 1;
}
int StrAssigh(HString *s,char *tval)//堆串赋值函数
{
	int len,i=0;
	if(s->ch!=NULL)	free(s->ch);
	while(tval[i]!='\0') i++;
	len=i;
	if(len)
	{
		s->ch=(char*)malloc(len);
		if(s->ch==NULL) return 0;
		for(i=0;i<len;i++)	s->ch[i]=tval[i];	
	}	
	else
		s->ch=NULL;
	s->len=len;
	return 1;
} 
3.2.3 块链串
#definr BLOCK_SIZE 4//每个结点存放字符个数
typedef struct Block
{
	char ch[BLOCK_SIZE];
	struct Block *next;	
} Block;
typedef struct{
	Block *head;
	Block *tail;
	int len;
}BLString;

3.3 串的模式匹配

//字符串的匹配
#include<stdio.h>
#include<time.h>
#define MAXSIZE 100
typedef struct
{
	char ch[MAXSIZE];
	int len;
}SString;

void Ini(SString &S)
{
	S.len=0;
}

int StrIndex(SString s,int pos,SString t)//顺序串的简单模式匹配
{
	int start=pos;
	int m=start,n=0;
	if(t.len==0) return (0);
	while(m<s.len && n<t.len)
	{
		if(s.ch[m]==t.ch[n])
		{
			m++,n++;
		}
		else
		{
			start++;
			n=0;
			m=start;
		}
	}	
	if(n==t.len) return start;
	else return (-1);
}



int Kmp(SString s,SString t)//KMP算法
{
	int i=0, j=0;
	int k=-1;
	int next[t.len];
//构建next数组
	next[0]=-1;
	while(j<t.len-1)
	{
		if(k==-1 || t.ch[j]==t.ch[k])
		{
			j++,k++;
			next[j]=k;
		}
		else 
		{
			k=next[k];
		}
	}
	j=0;
//匹配规则
	while(i<s.len && j<t.len)
	{
		if(s.ch[i]==t.ch[j] || j==-1)
		{
			i++,j++;
		}
		else
		{
			j=next[j];
		}
	}
	if(j==t.len) return (i-j);
	else return (-1);
}



int main()
{
	int i=0,j=0,pos;
	char c,l;
	double duration;
	clock_t start,stop;
	SString s, t;
	Ini(s);
	Ini(t);
	printf("please input the text string for s:");
	c=getchar();
	while(c!='$')
	{
		s.ch[i]=c;
		s.len++;
		i++;
		c=getchar();
				
	}
	getchar(); 
	printf("please input the match string for t:");
	l=getchar();//注意换行符 
	while(l!='$')
	{
		t.ch[j]=l;
		t.len++;
		j++;
		l=getchar();	
		
	}
	printf("please input the pos:");
	scanf("%d",&pos);
	start=clock();
	printf("简单模式匹配:");
	if(StrIndex(s,pos,t)!=-1)
	{
		printf("\n匹配成功");
		printf("\nThe start is %d",StrIndex(s,pos,t));
		stop=clock();
		duration=((double)(stop-start));
		printf("\nthe StrIndex time is %f",duration);
	}
	else
		printf("匹配失败");
	start=clock();
	printf("\nKMP匹配:");
	if(Kmp(s,t)!=-1)
	{
		printf("\n匹配成功");
		printf("\nThe start is %d",Kmp(s,t));
		stop=clock();
		duration=((double)(stop-start));
		printf("\nthe Kmp time is %f",duration);
	}
	else
		printf("匹配失败");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值