第四章 字符串和多维数组
一.字符串
1.字符串:是零个或多个字符组成的有限序列。(只包含空格的串称为空格串)
注:字符串是以字符作为数据元素的线性表。
2.空串:长度(串中所包含的字符个数称为串的长度)为0的串。
3.子串:字符串中任意个连续的字符组成的子序列。
4.位置:子串的第一个字符在主串中的序号称为子串在主串中的位置。
5.字符串是数据元素为单个字符的线性表,一般采用顺序存储。
6.表示串的长度的方法:
(1)用一个变量来表示串的长度。
(2)在串尾存储一个不会在串中出现的特殊字符作为字符串的终结符,例如在C++语言中用`\0`来表示串的结束,这种存储方法不能直接得到串的长度,而是通过判断当前字符是否为`\0`来确定串是否结束,从而求得串的长度。
(3)用数组的0号单元存放串的长度,串值从1号单元开始存放。
7.模式匹配:给定两个字符串S=“s1s2s3s4...sn”和T=“t1t2t3t4...tm”,在主串S中寻找子串T的过程。(T称为模式)
8.朴素的模式匹配算法BF:
int BF (char S[],char T[])
{
i=0;j=0;
while((S[i]!=`\0`)&&(T[j]!=`\0`))
{
if(S[i]==T[j]){i++;j++;}
else{i=i-j+1;j=0;}
}
if(T[j]==`\0`)return(i-j+1);
else return 0;
}
二.多维数组
1.数组:由类型相同的数据元素构成的有序集合。
2.每个数据元素称为一个数据元素。
二维数组的每个元素含有两个下标,需将二维关系映射为一维关系。常用的映射方法有两种:以行序为主序(按行优先)和以列序为主序(按列优先)。
3.按行优先存储的基本思想是:先行后列,先存储行号较小的元素,行号相同者先存储列号较小的元素。
三.矩阵的压缩存储
1.特殊矩阵:阶数很高的矩阵,同时在矩阵中有很多值相同的元素并且他们的分布有一定的规律。
2.稀疏矩阵:矩阵中有很多零元素。
3.压缩存储的基本思想是:为多个相同的元素只分配一个存储空间;对零元素不分配存储空间。
四.应用举例
1.字符串的应用举例
凯撒加密算法KaiSai:
Void KaiSa(char S[],char T[],int k)
{
For(i=0;S[i]!=`\0`;i++)
T[i]=`a`+(S[i]-`a`+k)%26;
}
2.数组的应用举例-------幻方
奇数阶幻方算法Square:
Void Square(int a[][],int n)
{
I=0;j=n/2;
A[i][j]=1;
For(k=2;k<=n*n;k++)
{
iTemp=i;jTemp=j;
I=(i-1+n)%n;
J=(j-1+n)%n;
If(r[i][j]>0)
{
I=(iTemp+1)%n;
J=jTemp;
}
R[i][j]=k;
}
}