您的位置:首页 > 理论基础 > 数据结构算法

数据结构之String

2015-07-17 23:12 316 查看
静态表示方法

#include<iostream>
using namespace std;

#define MAXSTRLEN 255

#define TRUE 1
#define FALSE 0
#define Status int

typedef unsigned char String[MAXSTRLEN];

Status StrAssign(String &T,char *chars);//创建串
Status StrEmpty(String S);//判断串是否为空
Status StrCompare(String S,String T);//比较串
Status StrCopy(String &S,String T);//复制串
int StrLength(String S);//返回串的长度
Status Concat(String &T,String S1,String S2);//连接串
Status SubString(String &Sub,String S,int pos,int length);//替换串
int Index(String S,String T,int pos);
Status Replace(String &S,String T,String V);
Status StrInsert(String &S,int pos,String T);
Status StrDelete(String &S,int pos,int length);
void StrPrint(String S);
void DestoryString(String &S);

int main()
{
String S;
//测试赋值函数
if(StrAssign(S,"abcd"))
{
printf("赋值成功\n");
StrPrint(S);
}
//测试复制函数
char t[20]="I like coding";
String S1,T;
StrAssign(T,t);
if(StrCopy(S1,T))
{
printf("复制成功!\n");
StrPrint(S1);
}

if(StrCompare(S,S1))
printf("S和S1相等\n");
else
printf("S和S1不相等\n");

String temp="";
if(StrEmpty(temp))
printf("temp为空字符串\n");
else
printf("temp不为空\n");
printf("s的长度为%d\n",StrLength(S));

String S2;
if(Concat(S2,S,S1))
{
printf("连接成功  ");
StrPrint(S2);
}

String s,V,ss;
StrAssign(s,"bc");

int pos=Index(S,s,1);
printf("%d\n",pos);

StrAssign(ss,"I am abcd haha ,you are a bitch");
StrAssign(V,"heor");
StrPrint(ss);
if(Replace(ss,S,s))
{
printf("替换成功!:\n");
StrPrint(ss);
}

//插入
StrInsert(ss,2,s);
StrPrint(ss);

StrDelete(ss,2,2);
StrPrint(ss);
return 0;
}

Status StrAssign(String &T,char *chars)
{
int m=strlen(chars);
if(m>MAXSTRLEN)return FALSE;
for(int i=0;i<m;i++)
T[i+1]=chars[i];
T[0]=m;
return TRUE;
}

Status StrEmpty(String S)
{
if(S[0]==0)
return TRUE;
return FALSE;
}

Status StrCompare(String S,String T)
{
int i=1;
if(S[0]==T[0])
for(i=1;i<=S[0];i++)
if(S[i]!=T[i])
break;

int n=S[0];
if(i-1==n)
return TRUE;
return FALSE;
}

int StrLength(String S)
{
return S[0];

}

Status StrCopy(String &S,String T)
{
S[0]=T[0];
for(int i=1;i<=S[0];i++)
S[i]=T[i];
return TRUE;
}

Status Concat(String &T,String S1,String S2)
{
int uncut,i,j;
if(S1[0]+S2[0]<=MAXSTRLEN)//如果没有截断
{
T[0]=S1[0]+S2[0];
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(j=1;j<=S2[0];j++)
T[j+i-1]=S2[j];
uncut=TRUE;
}
else if(S1[0]<MAXSTRLEN&&S1[0]+S2[0]>MAXSTRLEN)//部分截断
{
T[0]=MAXSTRLEN;
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(j=1;j+S1[0]<=MAXSTRLEN;j++)
T[i++]=S2[j];
uncut=FALSE;
}
else if(S1[0]>=MAXSTRLEN)
{
int i;
T[0]=MAXSTRLEN;
for(i=1;i<=MAXSTRLEN;i++)
T[i]=S1[i];
uncut=FALSE;
}
return uncut;
}

Status SubString(String &Sub,String S,int pos,int length)
{
int flag=0;
int i;
if(length>S[0]-pos+1)return FALSE;
Sub[0]=length;
for(i=1;i<=length;i++)
Sub[i]=S[i+pos-1];
flag=1;
return flag;
}

int Index(String S,String T,int pos)
{
int m,n,i;
String sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
for(i=pos;i<=n-m+1;i++)
{
if(SubString(sub,S,i,m))
if(StrCompare(sub,T))
return i;
}

}
return FALSE;
}

Status Replace(String &S,String T,String V)
{
int i,pos;
if(S[0]<T[0]||S[0]<V[0])return FALSE;
pos=Index(S,T,1);
if(pos==0)
{
printf("替换错误!\n");
return FALSE;
}
else
{
if(T[0]==V[0])
for(i=pos;i<=V[0];i++)
S[i]=V[i];
else if(T[0]<V[0])
{
int length=V[0]-T[0];
for(i=S[0];i>=pos+length-1;i--)
S[i+length]=S[i];
for(i=pos;i<=V[0];i++)
S[i]=V[i];
}
else if(T[0]>=V[0])
{
int length = T[0]-V[0];
int n=StrLength(V);
int m=StrLength(S);
StrPrint(V);
for(i=pos;i<=pos+n-1;i++)
S[i]=V[i-pos+1];
for(;i<=m-length;i++)
S[i]=S[i+length];
}
}
return TRUE;
}

Status StrInsert(String &S,int pos,String T)
{
int i,m,n;
m=StrLength(T);
n=StrLength(S);
if(pos<=n)
{
for(i=n;i>=pos;i--)
S[i+m]=S[i];
for(i=1;i<=m;i++)
S[pos+i-1]=T[i];
}
else
{
for(i=1;i<=m;i++)
S[n+i]=T[i];
}
return TRUE;
}

Status StrDelete(String &S,int pos,int length)
{
int m=StrLength(S);
if(pos>m||length>m-pos+1)return FALSE;
for(int i=pos;i<=m-length;i++)
S[i]=S[i+length];
return TRUE;
}

void StrPrint(String S)
{
int n=S[0];
for(int i=1;i<=n;i++)
printf("%c",S[i]);
printf("\n");
}


串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意char c=2;实际上是对应存储的ASCII码,使用的时候需要直接传换成int型,int a=c就解决了。

动态表示

#include<iostream>
#include<cstring>
using namespace std;
#define OK 1
#define ERROR 0
#define SSIZE 100
#define Status int
#define OVERFLOW 0

typedef struct{
char *ch;//若为空串,按长度分配
int length;
}HString;

void StrInit(HString &S);
Status StrAssign(HString &T,char *chars);
int StrLength(HString S);
int StrCompare(HString S,HString T);
Status ClearString(HString &S);
Status Concat(HString &S,HString S1,HString S2);
HString SubString(HString S,int pos,int length);
void StrPrint(HString S);

int main()
{
int n;
char a[100]="abc",b[100]="bcd";
HString S,T,SS;
StrInit(S);
StrInit(T);
StrInit(SS);
StrAssign(S,a);
StrAssign(T,b);
n=StrCompare(S,T);
if(n>0)
printf("S>H\n");
else if(n==0)
printf("S=H\n");
else
printf("S<H\n");
//连接操作
if(Concat(SS,S,T))
StrPrint(SS);
else
printf("连接失败!\n");

HString V;
V=SubString(SS,1,3);
StrPrint(V);
return 0;
}

void StrInit(HString &S)
{
S.ch=NULL;
S.length=0;
}

Status StrAssign(HString &T,char *chars)
{
int n;
n=strlen(chars);
if(T.ch)free(T.ch);
if(n==0)
{
T.ch=NULL;
T.length=0;
}
else
{
T.ch=(char*)malloc(n*sizeof(char));
if(!T.ch)exit(ERROR);
for(int i=0;i<n;i++)
T.ch[i]=chars[i];
T.length=n;
}
return OK;
}

int StrLength(HString S)
{
return S.length;
}

int StrCompare(HString S,HString T)
{
//	if(strcmp(S,T)>0)   //这种方法不行,因为字符串结尾没有终结符,所以不能够比较
//		return 1;
//	else if(strcmp(S,T)==0)
//		return 0;
//	else
//		return -1;

for(int i=0;i<S.length&&i<T.length;i++)
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
return S.length-T.length;
}

Status ClearString(HString &S)
{
if(S.ch)
{
free(S.ch);
S.ch=NULL;
}
S.length=0;
return OK;
}

Status Concat(HString &S,HString S1,HString S2)
{
int i;
if(S.ch)free(S.ch);
S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char));
if(!S.ch)return ERROR;//申请内存失败;
S.length=S1.length+S1.length;
for(i=0;i<S1.length;i++)
S.ch[i]=S1.ch[i];
for(i=0;i<S2.length;i++)
S.ch[i+S1.length]=S2.ch[i];
return OK;
}

HString SubString(HString S,int pos,int length)
{
HString T;
StrInit(T);
T.ch=(char*)malloc(length*sizeof(char));
if(pos+length+1>S.length)exit(0);
for(int i=pos;i<pos+length;i++)
T.ch[i-pos]=S.ch[i];
T.length=length;
return T;

}
void StrPrint(HString S)
{
for(int i=0;i<S.length;i++)
printf("%c",S.ch[i]);
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: