数据结构(西北大学)_串
串的基本概念
字符串是一个线性表,一个特定的线性表,其特定在组成线性表的每一个元素就是一个单字符。字符串在编程过程中使用次数非常频繁。
字符串概念:字符串(英语:string),是由零个或多个字符组成的有限序列。一般记为 s=“a1a2···an”(n>=0)。
概念解释:字符串组成的线性表的一般形式为,'a1a2···an'。每一个ai都属于一个字符集合,ai∈V字符集,其中的每一个ai就是一个字符。
s=“a1a2···an”,这里我们说s为串名也就是标识符,引号中的为串值。这里我们应用的方式,可以使用表达式方式出现,也可以使用值的方式出现。
关于串的长度,“a1a2···an”,这里n就是线性表的表长度也就是字符串的长度(字符的个数)。
关于空串和空格串。空串,“”,引号中没有任何东西,长度为0。空格串," ",长度大于0,引号中的元素为空格。空串和空格之间的区别就是组成线性表的长度是0还是大于0。
我们给出子串的概念。子串是串的一部分。
子串的概念,串中任意个连续的字符组成的子序列称为该串的子串。如String这个字符串,Str、tr、Strin是一个子串。
字串在主串中的位置。如String,Str是一个子串,那么我们怎么表示子串呢?
(String,起始位置,终结位置)这是一种表示子串的方法。
(String,起始位置,长度0)这是一种表示子串方法。
左取(String,长度),右取(String,长度),所谓左取右取就是将起始位置规定了,只需要知道长度就可以表示子串。
串相等:当且仅当串的长度相等,并且对应位置的字符都相等串才算相等。
串的存储实现
表达字符串时我们告诉串的名字,串的位置,串的区间。
有一个串名的存储区,将其和串值的存储区关联起来。串值存储的区域可以使用定长顺序串(长度固定,顺序存储方式),也可以用链表(链式结构)。
定长顺序串
#define MAXLEN 20
typedef struct{
char ch[MAXLEN]; 字符数组,字符组成的数组。数组中有开辟的长度。将串值放入到字符数组中。
int len; 指示器,表示串的长度。
}SString
整体表示顺序串的结构类型。
定长顺序串基本操作的实现(顺序串一定有长度的限制,事先开辟的长度用来存储字符)
1串插入函数、2串删除函数、3串复制函数、4判空函数、5串比较函数、6求串长函数、7清空函数、8连接函数、9求子串函数、10定位函数。
串插入函数,在进行串的插入时,插入位置pos将串分为两个部分(假设A,B,长度为LA、LB)及待插入部分(假设为C,长度为LC),则串由插入前的AB变为ACB,可能有三种情况:
1.插入后串长(LA+LC+LB)<= MAXLEN 则将B后移LC个元素位置,再将C插入。这种情况是理想的,所有字符能放入事先开辟的空间。
2.插入后串长>MAXLEN且pos+LC<MAXLEN 则B后移时有部分字符被舍弃。这种情况是需要舍弃B。
3.插入后串长>MAXLEN且pos+LC>MAXLEN 则B的全部字符被舍弃(不需要后移),并且C在插入时也有部分字符被舍弃。这种情况C和B都需要进行舍弃。
int insert_string() { SString* s, t; /*s,主串。t,要插入串*/ int pos; /*插入字符的位置*/ int i; /*插入位置不合法*/ if (pos < 0 || pos > s->len) { return 0; } /*全能放的下*/ if (s->len + t.len <= LENMAX) { /*插入后串长<=LENMAX*/ /*将B后移*/ for (i = s->len + t.len - 1; i >= t.len + pos; i--) { s->str[i] = s->str[i - t.len]; } for (i = 0; i < t.len; i++) { s->str[i + pos] = t.str[i]; } s->len = s->len + t.len; } /*能放下c,但是b要舍弃部分*/ else if (pos + t.len >= LENMAX) { /*插入后串长>LENMAX,但是串t的字符序列可以全部插入*/ for (i = LENMAX - 1; i > t.len + pos - 1; i--) { s->str[i] = s->str[i - t.len]; } for (i = 0; i < t.len; i++) { s->str[i + pos] = t.str[i]; s->len = LENMAX; } } /*c要舍弃,b也要舍弃*/ else { /*串t的部分字符序列要舍弃*/ for (i = 0; i < LENMAX - pos; i++) { s->str[i + pos] = t.str[i]; } s->len = LENMAX; } return 1; }
posted on 2020-12-24 23:04 XiaoXiaoli 阅读(177) 评论(0) 收藏 举报
浙公网安备 33010602011771号