字符串
字符串
1.1 字符串及其运算
1.2 字符串的存储表示
1.3 模式匹配
1.1 字符串及其运算
⚫字符串:简称串,是特殊的线性表,其特殊性主要在于表 中的每个元素是一个字符,以及由此而要求的一些特殊操 作。
⚫ 长度:一个串中包括的字符个数。长度为零的串称为空串。
⚫ 子串:字符串s1中任意个连续的字符组成的子序列s2被称 为是s1的子串,而称s1是s2的主串。
⚫ 位置:子串在主串中的位置是以子串的第一个字符在主串 中的字符序号(下标+1)。
⚫ 相等:两个串的长度相等,并且对应位置上的字符都 相等。
⚫空格串:一个或多个空格。
⚫字典序关系:如果整个字符集上有全(线)序关系,则两 个字符串之间有如下字典序关系:
串的基本运算
⚫创建一个空串 string createNullStr(void)
⚫ 判断一个串是否为空串 int isNullstr(String s)
⚫ 求一个串的长度 int length(String s)
⚫ 将两个串拼接在一起构成一个新串 String concat(String s1, String s2)
⚫ 在串s中,求从串的第i个字符开始连续j个字符所构成的子串 String subStr(String s, int i, int j)
⚫ 求串S2在串S1中第一次出现的位置 int index(String s1,String s2)
顺序串
1.2 串的存储表示
struct SeqString /* 顺序串的类型 */
{
int MAXNUM;
int n; /* 串的长度,nMAXNUM */
char *c;
};
typedef struct SeqString *PSeqString;
➢ 顺序表示举例
串s = “abcdef”,用顺序表示方式, 假设s是struct SeqString类型的变量,那么它的元素在数 组中的存放方式如下图所示:
创建一个空串
//创建一个空串
PSeqString createNull_seq(int m){
PSeqString pstr =(PSeqString)malloc(sizeof(SeqString));
if (pstr!=NULL)
{
pstr->c=(char*)malloc(sizeof(char)*m);
if(pstr->c){
pstr->n=0;
pstr->MAXNUM=m;
return pstr;
}
}else
{
cout<<"out of space"<<endl;
}
return NULL;
}
求顺序表示的串的子串
PSeqString subStr_seq(PSeqString s,int i,int j){
PSeqString s1;
int k;
s1=createNull_seq(j);
if(s1==NULL)return NULL;
if (i>0&&i<=s->n&&j>0)
{
if(s->n<i+j-1)j=s->n-i+1;
for (int k = 0; i < j; i++)
s1->c[k]=s->[i+k-1];
s1->n=j;
}
return s1;
}
链接串
在串的链接表示中,每个结点包含两个字段:字符和指针,分别 用于存放字符和指向下一个结点的指针。这样一个串就可用一个 单链表来表示,其类型定义为:
➢ 链接表示举例s=“abcdef”
链表各节点存储数据个数的多少可参考以下几个因素:
- 串的长度和存储空间的大小:若串包含数据量很大,且链表申请的存储空间有限,此时应尽可能的让各节点存储更多的数据,提高空间的利用率(每多一个节点,就要多申请一个指针域的空间);反之,如果串不是特别长,或者存储空间足够,就需要再结合其他因素综合考虑;
- 程序实现的功能:如果实际场景中需要对存储的串做大量的插入或删除操作,则应尽可能减少各节点存储数据的数量;反之,就需要再结合其他因素。
结构体
struct StrNode{
char c;
StrNode* next;
};
typedef StrNode *LinkString;
typedef StrNode *PStrNode;
LinkString createNullStr_Link(){
LinkString pst;
pst =(LinkString)malloc(sizeof(StrNode));
if (pst!=NULL)
pst->next=NULL;
else
cou<<"out of space"<<endl;
return pst;
}
LinkString subStr_link (LinkString s, int i, int j){
LinkString s1;
PStrNode p,q,t;
int k;
//创建一个空串
s1 = createNullStr_Link();
if(s1==NULL){
cout<<"Out of space "<<endl;
return NULL;
}
if (i<1||j<1)
return s1;
p=s;//p指向主串
for ( k = 1; k <= i; k++)
{
if (p!=NULL)
p=p->next;
else
return s1;
}
if (p==NULL)
return s1;
t=s1;//t指向子串尾
for (k = 1; k < j; k++)
{
if (p!=NULL)
{
q= (PStrNode)malloc(sizeof(struct StrNode));
if (q==NULL)
{
cout<<"out of space "<<endl;
return s1;
}
q->c=p->c;
q->next=NULL;
t->next=q;//在子串尾加入新节点
t=q;//t指向子串尾
p=p->next;
}
return s1;
}
}
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13033671.html