您的位置:首页 > 其它

串及其功能的实现

2015-06-04 23:42 246 查看
#ifndef _STRING_H_
#endif  _STRING_H_
//#pragma once

#include<iostream>
using namespace std;

#define MAX_STRING_SIZE 8

typedef char SString[MAX_STRING_SIZE+1];

int Length(SString s)
{
return strlen(s);
}

int Index1(char *T, char *P)
{
int t_length = strlen(T);
int p_length = strlen(P);
for(int i=0; i<=t_length-p_length;++i)
{
for(int j=0; j<p_length;++j)
{
if(T[i+j] != P[j])
{
break;
}
}

if(j == p_length)
{
return i;
}
j = 0;
}
return -1;
}

bool StringConcat(SString T, SString s1, SString s2)
{
int t_length = MAX_STRING_SIZE;
int s1_length = Length(s1);
int s2_length = Length(s2);

if(t_length >= s1_length+s2_length)
{
for(int i=0; i<s1_length; ++i)
{
T[i] = s1[i];
}
for(int j=0; j<s2_length; ++j)
{
T[i+j] = s2[j];
}
T[i+j] = '\0';
return true;
}
else if(t_length>s1_length && t_length<s1_length+s2_length)
{
for(int i=0; i<s1_length; ++i)
{
T[i] = s1[i];
}
for(int j=0; j<t_length-s1_length; ++j)
{
T[i+j] = s2[j];
}
T[i+j] = '\0';
return false;

}
else if(t_length < s1_length)
{

}
return true;
}

/* 若S为空串,则返回true,否则返回false */
bool StrEmpty(SString S)
{
if (S[0] == NULL)
return true;
else
return false;
}

/*  初始条件: 串S和T存在 */
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
int StrCompare(SString S, SString T) //StrCompare(S,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]; //
}
/* 生成一个其值等于chars的串T */
bool StrAssign(SString T, char *chars)
{
int i;
if (strlen(chars) > MAX_STRING_SIZE)
return false;
else {
T[0] = strlen(chars);
for (i = 1; i <= T[0]; i++)
T[i] = *(chars + i - 1);
return true;
}
}

/* 由串S复制得串T */
bool StrCopy(SString T, SString S)
{
int i;
for (i = 0; i <= S[0]; i++)
T[i] = S[i];
return true;
}
/* 返回串的元素个数 */
int StrLength(SString S)
{
return S[0];
}
/* 初始条件:串S存在。操作结果:将S清为空串 */
bool ClearString(SString S)
{
S[0] = 0;/*  令串长为零 */
return true;
}

/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
bool Concat(SString T, SString S1, SString S2)
{
int i;
if (S1[0] + S2[0] <= MAX_STRING_SIZE)
{ /*  未截断 */
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 <= MAX_STRING_SIZE - S1[0]; i++)
T[S1[0] + i] = S2[i];
T[0] = MAX_STRING_SIZE;
return false;
}
}
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
bool SubString(SString Sub, SString S, int pos, int len)
{
int i;
if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)
return false;
for (i = 1; i <= len; i++)
Sub[i] = S[pos + i - 1];
Sub[0] = len;
return true;
}

/*  初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */
/*  操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */
bool StrInsert(SString S, int pos, SString T)
{
int i;
if (pos < 1 || pos > S[0] + 1)
return false;
if (S[0] + T[0] <= MAX_STRING_SIZE)
{ /*  完全插入 */
for (i = S[0]; i >= pos; i--)
S[i + T[0]] = S[i];
for (i = pos; i < pos + T[0]; i++)
S[i] = T[i - pos + 1];
S[0] = S[0] + T[0];
return true;
}
else
{ /*  部分插入 */
for (i = MAX_STRING_SIZE; i <= pos; i--)
S[i] = S[i - T[0]];
for (i = pos; i < pos + T[0]; i++)
S[i] = T[i - pos + 1];
S[0] = MAX_STRING_SIZE;
return false;
}
}

/*  初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */
/*  操作结果: 从串S中删除第pos个字符起长度为len的子串 */
bool StrDelete(SString S, int pos, int len)
{
int i;
if (pos < 1 || pos > S[0] - len + 1 || len < 0)
return false;
for (i = pos + len; i <= S[0]; i++)
S[i - len] = S[i];
S[0] -= len;
return true;
}

/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
/* 蛮力法*/
int Index(SString S, SString T, int pos)
{
int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
int j = 1; /* j用于子串T中当前位置下标值 */
while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
{
if (S[i] == T[j]) /* 两字母相等则继续 */
{
++i;
++j;
} else /* 指针后退重新开始匹配 */
{
i = i - j + 2; /* i退回到上次匹配首位的下一位 */
j = 1; /* j退回到子串T的首位 */
}
}
if (j > T[0])
return i - T[0];
else
return 0;
}
/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
bool Replace(SString S, SString T, SString V)
{
int i = 1; /*  从串S的第一个字符起查找串T */
if (StrEmpty(T)) /*  T是空串 */
return false;
do {
i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */
if (i) /*  串S中存在串T */
{
StrDelete(S, i, StrLength(T)); /*  删除该串T */
StrInsert(S, i, V); /*  在原串T的位置插入串V */
i += StrLength(V); /*  在插入的串V后面继续查找串T */
}
} while (i);
return true;
}

/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
bool StrReplace(SString S, SString T, SString V) {
int i = 1; /*  从串S的第一个字符起查找串T */
if (StrEmpty(T)) /*  T是空串 */
return false;
do {
i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */
if (i) /*  串S中存在串T */
{
StrDelete(S, i, StrLength(T)); /*  删除该串T */
StrInsert(S, i, V); /*  在原串T的位置插入串V */
i += StrLength(V); /*  在插入的串V后面继续查找串T */
}
} while (i);
return true;
}
#include"String.h"

void main()
{
char *T = "abbaba";
char *P = "abc";

int index = Index1(T,P);
cout<<"index = "<<index<<endl;
cout<<StrCompare( T,P)<<endl;
//cout<<StrEmpty(T)<<endl;//空为1;非空为0
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: