数据结构字符串

数据结构字符串

// String.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "conio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;

#define BOOL int
#define TRUE 0
#define FALSE -1
#define MAXSIZE 256
//1.赋值 2.联接 3.求长 4.比大小 5.插入 6.删除 7.求子串 8.BF 9.KMP 10.替换
int OutMenu();
BOOL Fun_Assignment(char *s1,char *s2);
BOOL Fun_Connect(char *s1,char *s2);
int  Fun_Length(char *s);
BOOL Fun_Compare(char *s1,char *s2);
BOOL Fun_Insert(char *s1,int at_i,char *s2);
BOOL Fun_Delete(char *s,int begin,int DelLen);
char* Fun_SubString(char *s,int begin,int len);
int  Fun_BF(char *s1,char *s2);
int  Fun_KMP(char *s1,char *s2);
void GetNext(char *s,int next[]);
BOOL Fun_Replace(char *s1,char *s2,char *s3);

int _tmain(int argc, _TCHAR* argv[])
{
	char s1[MAXSIZE],s2[MAXSIZE],s3[MAXSIZE];
	int at_i,begin,len,ret;
	int  menu=1;
	while(menu)
	{
		menu=OutMenu();
		switch(menu)
		{
			case 0:
				system("cls");
				break;
			case 1:
				printf("请输入字符串1:");
				scanf_s("%s",s1,256);
				printf("请输入字符串2:");
				scanf_s("%s",s2,256);
				Fun_Assignment(s1,s2);
				printf("s1结果:%s",s1);
				printf("\n按任意键返回...");
				_getch();
				break;
			case 2:
				printf("请输入字符串1:");
				scanf_s("%s",s1,256);
				printf("请输入字符串2:");
				scanf_s("%s",s2,256);
				Fun_Connect(s1,s2);
				printf("s1结果:%s",s1);
				printf("\n按任意键返回...");
				_getch();
				break;
			case 3:
				printf("请输入求长字符串:");
				scanf_s("%s",s1,256);
				printf("长度为:%d",Fun_Length(s1));
				printf("\n按任意键返回...");
				_getch();
				break;
			case 4:
				printf("请输入字符串1:");
				scanf_s("%s",s1,256);
				printf("请输入字符串2:");
				scanf_s("%s",s2,256);
				printf("比较结果:%d",Fun_Compare(s1,s2));
				printf("\n按任意键返回...");
				_getch();
				break;
			case 5:
				printf("请输入字符串1:");
				scanf_s("%s",s1,256);
				printf("请输入字符串2:");
				scanf_s("%s",s2,256);
				printf("请输入插入位置:");
				scanf_s("%d",&at_i);
				Fun_Insert(s1,at_i,s2);
				printf("s1结果:%s",s1);
				printf("\n按任意键返回...");
				_getch();
				break;
			case 6:
				printf("请输入原字符串:");
				scanf_s("%s",s1,256);
				printf("请输入开始删除位置:");
				scanf_s("%d",&begin);
				printf("请输入删除长度:");
				scanf_s("%d",&len);
				Fun_Delete(s1,begin,len);
				printf("s结果:%s",s1);
				printf("\n按任意键返回...");
				_getch();
				break;
			case 7:
				printf("请输入原字符串:");
				scanf_s("%s",s1,256);
				printf("请输入开始位置:");
				scanf_s("%d",&begin);
				printf("请输入长度:");
				scanf_s("%d",&len);
				printf("子串结果:%s",Fun_SubString(s1,begin,len));
				printf("\n按任意键返回...");
				_getch();
				break;
			case 8:
				printf("请输入原字符串:");
				scanf_s("%s",s1,256);
				printf("请输入查找字符串:");
				scanf_s("%s",s2,256);
				Fun_BF(s1,s2);
				ret=Fun_BF(s1,s2);
				if(ret>-1)
					printf("子串位于:%d",ret);
				else
					printf("子串没有找到");
				printf("\n按任意键返回...");
				_getch();
				break;
			case 9:
				printf("请输入原字符串:");
				scanf_s("%s",s1,256);
				printf("请输入查找字符串:");
				scanf_s("%s",s2,256);
				Fun_BF(s1,s2);
				ret=Fun_KMP(s1,s2);
				if(ret>-1)
					printf("子串位于:%d",ret);
				else
					printf("子串没有找到");
				printf("\n按任意键返回...");
				_getch();
				break;
			case 10:
				printf("请输入原字符串:");
				scanf_s("%s",s1,256);
				printf("请输入被替换字符串:");
				scanf_s("%s",s2,256);
				printf("请输入替换成字符串:");
				scanf_s("%s",s3,256);
				if(Fun_Replace(s1,s2,s3))
					printf("s结果:%s",s1);
				else
					printf("被替换串没有找到");
				printf("\n按任意键返回...");
				_getch();
				break;
			default:
				printf("您输入有误,请重新选择。");
				_getch();
				break;
		}
	}
	return 0;
}

int OutMenu(void)
{
	int i;
	system("cls");
	printf("\n\n                                  字符串演示程序\n\n");
	printf("\t**************************************************************\n");
	printf("\t*   1.赋值             2.联接                3.求长          *\n");
	printf("\t*   4.比大小           5.插入                6.删除          *\n");
	printf("\t*   7.求子串           8.BF                  9.KMP           *\n");
	printf("\t*   10.替换            11.----               0.退出          *\n");
	printf("\t**************************************************************\n");
	cout<<"\nPlease Select 0~5: ";
	cin>>i;
	cout<<"\n\n";
	return i;
}

BOOL Fun_Assignment(char *s1,char *s2)
{
	int len=strlen(s2);
	for(int i=0;i<=len;i++)
		s1[i]=s2[i];
	return TRUE;
}
BOOL Fun_Connect(char *s1,char *s2)
{
	int len1=strlen(s1);
	int len2=strlen(s2);
	if((len1+len2)>=MAXSIZE)
	{
		printf("空间不足");
		return FALSE;
	}
	for(int i=len1,j=0;j<=len2;i++,j++)
		s1[i]=s2[j];
	return TRUE;
}
int  Fun_Length(char *s)
{
	int len=0;
	while(s[len]!=0)
		len++;
	return len;
}
BOOL Fun_Compare(char *s1,char *s2)
{
	int i=0,j=0;
	while(s1[i]==s2[j] && s1[i]!=0)
		i++,j++;
	return s2[j]-s1[i];
}
BOOL Fun_Insert(char *s1,int at_i,char *s2)
{
	int len1=strlen(s1);
	int len2=strlen(s2);
	if((len1+len2)>=MAXSIZE)
	{
		printf("空间不足");
		return FALSE;
	}
	int i,j;
	for(i=at_i,j=len2;i<=len1;i++,j++)
		s2[j]=s1[i];
	len2=strlen(s2);
	for(j=0,i=at_i;j<=len2;i++,j++)
		s1[i]=s2[j];
	return TRUE;
}
BOOL Fun_Delete(char *s,int begin,int delLen)
{
	int sLen=strlen(s);
	if((begin+delLen)>sLen)
	{
		printf("起始位置或长度错误");
		return FALSE;
	}
	for(int i=begin+delLen;i<=sLen;i++)
		s[i-delLen]=s[i];
	return TRUE;
}
char* Fun_SubString(char *s,int begin,int len)
{
	int sLen=strlen(s);
	if((begin+len)>sLen)
	{
		printf("起始位置或长度错误");
		return NULL;
	}
	char s_temp[256];
	int i=begin,j=0;
	for(;i<begin+len;i++,j++)
		s_temp[j]=s[i];
	s_temp[j]='\0';
	return s_temp;
}
int  Fun_BF(char *s1,char *s2)
{
	int len1,len2;
	len1=strlen(s1);
	len2=strlen(s2);
	int i=0,j=0;
	while (i<len1 && j<len2)
	{
		if (s1[i]==s2[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+1;
			j=0;
			if(i+len2>len1)
				break;
		}
	}
	if(j==len2)
		return i-len2;
	else
		return -1;
}
int  Fun_KMP(char *s1,char *s2)
{
	int next[MAXSIZE];
	GetNext(s2,next);
	int i,j,len1,len2;
	len1=strlen(s1);
	len2=strlen(s2);
	i=0;
	j=0;
	while(i<len1 && j<len2)
	{
		if (j==-1||s1[i]==s2[j])
		{
			i++;
			j++;
		}
		else
			j=next[j];
	}
	if(j==len2)
		return i-len2;
	else
		return -1;
}
void GetNext(char *s,int next[])
{
	int len=strlen(s);
	int i=0;
	int j=-1;
	next[0]=-1;
	while(i<len-1)
	{
		if (j==-1 || s[i]==s[j])
		{
			++i;
			++j;
			next[i]=j;
		}
		else
			j=next[j];
	}
}
BOOL Fun_Replace(char *s1,char *s2,char *s3)
{
	int len1,len2,len3;
	len1=strlen(s1);
	len2=strlen(s2);
	len3=strlen(s3);
	if((len1-len2+len3)>=MAXSIZE)
	{
		printf("空间不足");
		return FALSE;
	}
	int ret=Fun_BF(s1,s2);
	if(ret==-1)
		return FALSE;
	Fun_Delete(s1,ret,len2);
	Fun_Insert(s1,ret,s3);
	return TRUE;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值