数据结构: 串

串(string)(或字符串):是由零个或多个字符组成的有限序列,一般记为s=‘a1a1a3…an’(n>=0)其中,s是串的名,用单引号括起来的字符序列是串的值;ai(1<=i<=n)可以是字母,数字或者其他字符;串中字符数目n称为串的长度.

  1. 串的基本概念
    空串:零个字符的串称为空串
    空格串:由一个或多个空格组成的串’ '它的长度为串中空格字符的个数
    子串:串中任意个连续的字符组成的子序列称为该串的子串
    主串:包含子串的串相应地称为主串
    主串与子串:任意串都是自身的子串,子串在主串的位置指的是该子串的第一个字符在主串中的位置
    练习:
    1.若串S=“abcdefgh”,其中子串的数目是37.
    解析:‘a’:8
    ‘b’:7
    …8+7+6+5+4+3+2+1+1=37
    推广到一般,S="a1,a2,a3…an"其子串数目为(n+1)n/2+1.
    2.设S为一个长度为n的字符串,其中的字符各不相同,则S中的互异的非平凡子串(非空且不同于S本身)的个数为(n+1)n/2-1.

  2. 串的抽象数据类型定义

ADT String{
	数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n;n>=0}
	数据关系:S={<ai-1,ai>|ai-1∈D,i=2,...,n}
	基本操作:
	StrAssign(&T,chars)
	SubString(&Sub,S,pos,len)
	StrCopy(&T,S)
	StrEmpty(S)
	StrCompare(S,T)
	Contact(&T,S1,S2)
	StrLength(S)
	Index(S,T,pos)
	Replace(&S,T,V)
	StrInsert(&S,pos,T)
	StrDelete(&S,pos,len)
}ADT String
	

串与一般的线性表的区别:

  • 串的数据元素约束为字符集.
  • 串的基本操作通常针对串的整体或串的一个部分(子串)进行.
    Q:为何要单独讨论“串”类型?
    A:串操作比其他数据类型更复杂(如拷贝,连接操作)
    程序设计中,处理对象很多都是串类型.

3.串的表示方法
顺序存储:①定长顺序存储表示(静态数组结构)②堆分配存储表示(动态数组结构)
链式存储:链串 块链

#include<stdio.h>
#include<string.h>
int main(){
	int i,d;
	char s[27]="abcdefghijklmnopqrstuvwxyz";
	for(i=0;i<strlen(s);i++){
		d=i+1;
		printf("%-26.*s\n",d,s);
	}
}

运行截图:在这里插入图片描述

strcat(串1,串2) 串连接(将串2内容接在串1后面)

#include<stdio.h>
void main(){
	char s1[20]="I";
	char s2[20]="love";
	char s3[50]="Beijing Normal University";
	strcat(s1,s2);
	printf("s1=%s",s1);
	strcat(s1,s3);
	printf("s1=%s",s1);
}

strncat(串1,串2,n) 串连接(将串2内容最左边n个字符接在串1后面)

#include<stdio.h>
void main(){
	char s1[20]="I";
	char s2[20]="love";
	char s3[50]="Beijing Normal University";
	strcat(s1,s2);
	printf("s1=%s",s1);
	strcat(s1,s3,7);
	printf("s1=%s",s1);
}

strcmp(串1,串2) 串比较(按字典顺序)串1=串2,返回0;串1>串2,返回负值;串1<串2,返回正数.

#include<stdio.h>
void main(){
	int c1,c2,c3;
	char s1[20]="abc1234";
	char s2[20]="abz1";
	char s3[20]="abc1234";
	c1=strcmp(s1,s2);
	printf("c1=%d\n",c1);
	c2=strcmp(s2,s1);
	printf("c2=%d\n",c2);
	c3=strcmp(s1,s3);
	printf("c3=%d\n",c3);
}

strncmp(串1,串2,n) 串比较 把串2 最左边的n个字符与串1比较.

#include<stdio.h>
void main(){
	int c1,c2,c3;
	char s1[20]="abc1234";
	char s2[20]="abz1";
	c1=strcmp(s1,s2);
	printf("c1=%d\n",c1);
	c2=strcmp(s2,s1,3);
	printf("c2=%d\n",c2);
}

strcpy(串1,串2) 串拷贝(将串2复制到串1)

#include<stdio.h>
void main(){
	char s1[20]="I";
	char s2[20]="love";
	printf("s1=%s,s2=%s\n",s1,s2);
	strcpy(s1,s2);
	printf("s1=%s,s2=%s\n",s1,s2);
}

strncpy(串1,串2,n) 串拷贝(将串2最左边n个字符复制到串1)

#include<stdio.h>
void main(){
	char s1[20]="I";
	char s2[30]="Beijing Normal University";
	printf("s1=%s,s2=%s\n",s1,s2);
	strcpy(s1,s2,7);
	printf("s1=%s,s2=%s\n",s1,s2);
}

strchr(串,字符c) 串查找(在串中查找字符c第一次出现的位置) 若找到,则返回这个位置的地址;否则,返回空地址NULL.
strstr(串1,串2) 子串匹配(也称模式匹配)在串1查找内容与串2相同的子串第一个出现的位置 若找到,则返回这个位置的地址;否则,返回空地址NULL.

#include<stdio.h>
void main(){
	char s1[30]="Beijing Normal University";
	if(strstr(s1,"University")==NULL){
		printf("%s名称不包含University",s1);
		}else{
		printf("%s包含University",s1);
		}
	}

4.C语言的字符处理函数
用C语言处理字符时,要调用标准库函数

#include<ctype.h>
int isalnum(int ch);
int isalpha(int ch);
int isgraph(int ch);
int islower(int ch);
int isupper(int ch);
int isxdigit(int ch);
...

5.定长顺序存储表示
串的基本运算及其实现

  • 串的输入和输出
  • 串的长度
  • 判断串的此昂等
  • 串连接
    -取子串
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值