串(字符串,符号串):
串的定义:
串是由n(n>=0)个字符组成的有限序列,通常记作S=‘a1a2a3…an’,其中s为串名(也称串变量),一对单引号括起来的字符序列为串值。元素ai(1<=i<=n)可以是字母,数字,或者其他字符,串中字符个数n称为串的长度,长度为0的串称为空串。
串的几个概念:
串的基本操作:
1.给变量赋值ASSIGN(s1,s2)
2.测试一个串是否为空串EMPTY(S)
3.测试串值是否相等COMP(S1,s2)
4.两串链接CONCAT(s1,s2)
5.求串的长度STRLEN(S)
6.求字串SUBSTR(S,i,k)
7.求字串在主串中的位置INDEX(s1,s2)
8.串的替换REPLACE(s,s1,s2)
9.串的复制COPY(s1,s2)
10.串的插入INSERT(s1,i,s2)
11.串的删除DELETE(S,i,k)
串的存储结构:一种情况下,串值的分配是在编译器时候完成的,即所谓的静态存储分配。另一种情况就是串值的分配是在程序运行的阶段才完成,通常建立一个串值与串名的对照表,称为串变量的存储映像,串值的访问通过串变量的存储映像进行。
串的顺序存储结构:
1.紧缩方式:
在计算机内部每个字符用8位二进制编码表示,正好占用存储器的一个字节,而CPU访问存储器时,通常以字节位单位进行。一个字包含的字节数目称为字长。紧缩方式就是根据机器字的长度尽可能的将多个字符存放在一个字中。
2.非紧缩方式
非紧缩方式是以 存储单元为单位依次存放串中各个字符,即使一个单元可以存放多个字符,这种方式也只能存放一个字符。
3.单字节存储方式
在以字节为编址单位的机器中,存储的单位是字节,而每个字符正好占用一个字节,这样自然形成了一个存储单元存放一个字符的分配方式,串中相邻的字符依次顺序的存放在相邻的两个字节中。
串的链式存储:
Data域存放字符,link域指向下一个链接点的指针,
data link
每个链接点可以仅存放一个字符,也可以存放多个字符。
串的几个操作:
1.串的比较:
int equal(char s1[], char s2[])
{
int i = 0;
while (s1[i] != '\0'&&s2[i] != '\0')
{
if (s1[i] != s2[i])
return 0;
i++;
}
if (s1[i] != '\0'&&s2[i] != '\0')
return 1;;
return 0;
}
串的插入:
StrLink inserts(StrLink S, StrLink T, int i)
{
StrLink p, r;
int j;
if (T != NULL)
{
if (S == NULL) {
S = T;
return S;
}
p = S;
for ( j = 0; j < i; j++)
{
p = p->link;
if (p == NULL)
{
return NULL;
}
}
r = T;
while (r->link != NULL)
{
r = r->link;
}
if (i == 0)
{
r->link = p->link;
p->link = T;
}
return S;
}
}
串的模式匹配:
串的模式匹配称为字串的定位。
int Index(StrLink S, StrLink PAT)
{
StrLink p, q, save;
int i = 0;
if (PAT == NULL || S == NULL)
return 0;
p = S;
do
{
save = p->link;
q = PAT;
while (q != NULL && p != NULL && p->ch == q->ch)
{
p = p->link;
q = q->link;
}
i++;
if (q == NULL)
return i;
p = save;
} while (p!=NULL);
return 0;
}
第二种优化:
int Index(StrLink S, StrLink PAT)
{
StrLink p, r, q, t, save;
int n, k, i = 0;
if (PAT == NULL || S == NULL)
{
return 0;
}
q = PAT;
n = 1;
while (q->link != NULL)
{
q = q->link;
n++;
}
t = S;
save = S;
for ( k = 0; k < n-1; k++)
{
t = t->link;
}
while (t != NULL)
{
p = PAT;
r = save;
i++;
if (q->ch == t->ch)
{
while (p != q && p->ch == r->ch)
{
p = p->link;
r = r->link;
}
if (p == q && p->ch == r->ch)
return i;
}
save = save->link;
t = t->link;
}
return 0;
}