字符串(簡稱串)是一種特殊的線性表嚷量,對于計算機來說,處理的非數(shù)值對象就是字符串蜓竹,在最初的時候,字符串一般是作為輸入或輸出的直接量出現(xiàn)的储藐,并不對它進行直接操作俱济,慢慢隨著計算機的發(fā)展,串也成為了一個變量參與了運算钙勃。
串的基本概念
- 串是零個或多個字符組成的有限序列蛛碌,一般記作:
- S = "a1a2a3...an";
- 空串和空白串
- 長度為零的串被稱為空串,不含有任何字符
- 僅有一個或多個空格組成的字符串稱為空白串
- 子串和主串
- 子串可以說是主串的子序列
- 子串的位置:子串的第一個字符在主串中的序號稱為子串的位置
- 串變量和串常量
- 顧名思義串變量跟變量是一樣的辖源,而常量是不可改變的量
串的基本運算
其實在很多高級語言里面均提供了相應(yīng)的運算符或標(biāo)準(zhǔn)的庫函數(shù)來實現(xiàn)下面就描述下C語言的< string.h >庫中的一些常用的庫函數(shù)(自己嘗試實現(xiàn)的)
//求串長
int strlen(char *s)
{
//思路是找到字符串的結(jié)尾‘\0’就是他的長度了
//但其實源碼的方法更高效
int length = 0
while (*s++)
length++;
return length;
}
//串復(fù)制
char *strcpy(char *dest,const char * source)
{
char *r = dest;
//檢查指針是否有效
assert((dest!=NULL) && (source!=NULL));
//實行串復(fù)制
while(*dest!='\0' && *source!='\0')
*dest++ = *source++;
return r;
}
//串聯(lián)接
char *strcat(char *dest,const char *source)
{
char *r = dest;
//檢查指針是否有效
assert((dest!=NULL) && (source!=NULL));
//將指針移到目標(biāo)字符串的結(jié)尾處
while(*dest)
*dest++;
//進行拼接操作
while(*source)
*dest++ = *source++;
return r;
}
//字符串大小比較
//即兩個字符串自左向右逐個(按ANSCII碼大小進行比較)
//直到遇見零或‘\0’時比較結(jié)束
int strcmp(const char *str1,const char *str2)
{
//str1 = str2 返回零
//str1 < str2 返回一個小于零的數(shù)
//str1 > str1 返回一個大于零的數(shù)
while(*str1 == *str2)
{
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
串的存儲結(jié)構(gòu)
因為串也是一種特殊的線性表蔚携,所以就有串的存儲結(jié)構(gòu)也有順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)
串的順序存儲
串的順序存儲簡稱順序串,與順序表類似克饶,是用一組連續(xù)的存儲單元來存儲串中的字符序列酝蜒,所以一般就是用字符數(shù)組來實現(xiàn),但是對于不同存儲分配方式來說矾湃,可以分為
- 靜態(tài)存儲分配的順序串
- 動態(tài)存儲分配的順序串
定義描述:
靜態(tài)存儲分配的順序串:
//直接使用定長的數(shù)組來進行描述
#define MAXSIZE 200
char s[200]//可容納199個字符的順序串
//類似于順序表的定義
typedef struct
{
char s[MAXSIZE];
int length;
}SeqString;
動態(tài)存儲分配的順序串:
動態(tài)存儲分配的順序串一般來說不用考慮串長亡脑,用malloc()和free()來分配和釋放空間
//簡單的定義
char *s;
//類似順序表的定義
typedef struct
{
char *s;
int length;
}SeqString;
串的鏈?zhǔn)酱鎯Y(jié)構(gòu)
用單鏈表的方式存儲串值被稱為鏈串
鏈串與單鏈表的相比較而言,鏈串結(jié)點的數(shù)據(jù)域可以選擇是存儲單字符還是多個字符,通常結(jié)點大远豺,存儲密度就高,但帶來的是處理效率的降低坞嘀,而結(jié)點小躯护,存儲密度就低,但是處理效率會高很多丽涩,雖然串的鏈?zhǔn)酱鎯Y(jié)構(gòu)對于某些串運算(像連接運算或插入運算有一定的方便之處)棺滞,但是還是不如順序串靈活