【数据结构与算法】字符串,数组,稀疏矩阵,广义表

一.串 

1.字符串的基本概念

字符串(string)是由n (n≥0) 个字符组成的有限序列。字符串简称为串,一般记为:s = "a0 a1 … an-1" 其中:

⊙s是串名;

⊙用双引号括起来的字符序列是串值;

⊙ai (0≤i<n)可以是ASCII码字符中的可打印字符,通常是字母、数字等字符;

⊙i称为字符ai 在串中的位置;

⊙n称为串的长度;n=0时,s称为空串

⊙容易与空串相混淆的一种串是空格串空格串是由一个或多个空格组成的串,如4个空格组成的空格串“    ”,它的长度是4,而空串的长度为0。

串中任意多个连续的字符组成的子序列称为该串的子串。子串在该串中的位置就是子串的首字符在该串中的位置。如果两个字符串长度相等,且它们对应位置的字符都相等,则称这两个字符串等。 在C++中,串值必须用一对双引号括起来,但双引号本身不属于串。而字符用单引号括来。串"w"和字符'w'是两个不同的概念,前者是字符串,后者是字符。串是一种线性结构,因此,串既可以用顺序存储结构来存储,也可以用链表存储结构来存储。由于每个字符占空间很小,只占8位二进制,所以串通常采用顺序存储结构存储,它比用链式存储结构存储效率高,实现起来也方便。

2.常用的字符串函数 

char s1[ ] = "It is a car";
char s2[ ] = "jeep"; 
char s3[ ] = "car"; 
int result; char s4[20] ,*p;

(1) 串长度   int strlen(char *str):

cout << strlen(s1)<<endl; //输出11 
cout << strlen(s2)<<endl; //输出4 

(2) 串拷贝 char *strcpy(char *str1,char *str2):

strcpy(s4,s2); //s4 = "jeep"

(3) 串连接 char *strcat(char *str1,char *str2):    

strcat(s2,s3); //s2 = "jeepcar" 

(4) 串比较 int strcmp(char *str1,char *str2):    

result = strcmp(s2,s3);  //result>0   
result = strcmp(s2,s2);  //result=0   
result = strcmp(s3,s2);  //result<0 

(5) 串中字符定位 char *strchr(char *str , char ch);

p = strchr(s1 , 'c');//p指在s1中字符'c'首次出现的位置 
strcpy(p , s2);     //s1 = "It is a jeep" 

二.数组 

1. 数组的基本概念

一维数组A(array)是n (n≥0)个相同数据类型的数据元素a0,a1, , an-1构成的有限线性序列。其中n叫做数组长度或数组大小,若n=0就是空数组。

二维数组:当每一个数组元素ai(0≤i≤n-1)本身又是一个一维数组时,则A就是一个二维数组。

m维数组:一个m(m≥2)维数组中的每一个数组元素是一个m-1维的数组。

2.数组中的计算

假设二维数组a[m][n]的首地址为p,即a[0][0]的起始地址为p,每个元素占l个字节,以行序为主序存储方式来存储数组a,计算数组元素a[i][j]的地址loc(i,j)。因为在一维数组a中,第k个元素a[i]的地址是: loc(i) = d + (k-1) * l, 因此只要计算出a[i][j]是数组的第几个元素就可计算出loc(i, j)。 若设其为k,则有k = i*n+j+1,所以,loc(i, j) = p+ (i*n+j ) *l 更一般的公式:loc(i,j) = d + (k-1) * l,d 表示二维数组第1个元素的地址,k表示a[i][j]是第k个元素。

三.稀疏矩阵 

1.稀疏矩阵的定义 

矩阵本身就是二维数组。对于一个矩阵,如果零元素较多,还是采用上一节所述的存储方式来存储的话,就会使得大量的存储空间存放同一个值零,从而造成事实上的存储空间的浪费。像这种零元素非常多的矩阵称为稀疏矩阵。因为稀疏矩阵是非零元素很少的矩阵,我们只要存储非零元素就行了。但由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须同时记下它所在的行和列的位置(i,j)。反之,一个三元组(i,j,aij)唯一确定了矩阵A的一个非零元。因此,稀疏矩阵可由表示非零元的三元组及其维数唯一确定。整个稀疏矩阵的存储结构既可以采用顺序结构存储,也可以采用链式结构存储。  

 四.广义表的定义 

广义表LS是由n≥0个表元素α1 ,α2 , … , αn 组成的有限序列,其中表元素αi (1≤i≤n) 或者是一个数据元素 (可称为单元素或原子),或者是一个表(称为子表)。记作 LS = (α1 ,α2 , … , αn ) 其中LS是表名,表的长度为n。长度为0的广义表为空表。一般用大写字母表示表名,用小写字母表示数据元素。如果n≥1,则称α1 为广义表LS的表头(head),称(α2 , … , αn )为广义表LS的表尾(tail)。

广义表的表尾始终是一个广义表。 

广义表的定义是递归的,因为在表的描述中又用到了表。

广义表的例子:

(1) A=( )  空表,它的长度为零。

(2) B=(e) 单元素表,head(B)=e,tail(B)=( )。

(3) C=(a,(b, c, d)) 长度为2,两个表元素分别为单元素a和子表(b, c, d)。head(C)=a ,tail(C)=      ((b ,c, d))。

(4) D=(A, B, C) 长度为3,三个表元素都是子表。head(D)=A,tail(D)=(B , C)。

(5) E= (a, E) 长度为2,E是一个递归表,它对应于无限表E = (a,(a, (a ,… )))。head (E)=a, tail(E)=(E)。

广义表中括号的重数即为广义表深度(空表的深度为1) 

depth(A)=1,depth(B)=1,depth(C)=2, depth(D)=3,    depth(E) 为无穷大 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值