串(字符串)

串的定義

串是由零個或多個字符組成的有限序列,又名叫字符串。一般記爲s=“a1a2…an”(n>=0),其中s是串的名稱,用雙引號括起來的字符序列是串的值,注意引號不屬於串的內容。串中的字符數目n稱爲串的長度。零個字符的串稱爲空串

下面是一些需要注意的基本概念:

(1)序列:說明串的相鄰字符之間具有前驅和後繼的關係

(2)空格串:是隻包含空格的串。它和空串是不同的,有內容,有長度,而且可以不止一個空格

(3)子串和主串:串中任意個數的連續字符組成的子序列稱爲該串的子串,相應地,包含子串的串稱爲主串

(4)子串在主串中的位置就是子串的第一個字符在主串中的序號

串的比較

串的比較是通過組成串的字符之間的編碼來進行的,而字符的編碼指的是字符在對應字符集中的序號。

計算機中的常用字符是使用標準的ASCII編碼,更準確一點是由7位二進制數表示一個字符,總共可以表示128個字符。後來發現一些特殊符號,128個不夠用,於是擴展ASCII碼由8位二進制數表示一個字符,總共可以表示256位。後面又由於世界各地各種語言的差異,256個字符肯定不夠表示,出現了Unicode編碼,比較常用的是由16位的二進制數表示一個字符,總共可以表示6.5萬,足夠表示世界上所有語言的所有字符。當然爲了兼容ASCII碼,Unicode的前256個字符與ASCII碼完全相同

那麼對於兩個不同的串,我們如何判定它們的大小呢?

給定兩個串:s=“a1a2…an”,t=“a1a2…am”,當滿足以下條件之一時,s<t.

(1)n<m,且ai=bi(i=1,2,…,n)。

(2)存在某個k<=min(m,n),使得ai=bi(i=1,2,…,k-1),ak<bk

串的抽象數據類型

串中最常見的操作就是查找子串位置、得到指定位置子串、替換子串等操作。西面是抽象數據類型的定義:

ADT 串(string)
Data
	串中元素僅由一個字符組成,相鄰元素具有前驅和後繼關係
Operation
	StrAssign(T,*chars):生成一個其值等於字符串常量chars的串T。
	StrCopy(T,S):串S存在,由串S複製得到串T。
	ClearString(S):串S存在,將串清空。
	StringEmpty(S):若串S爲空,返回true,否則返回false
	StrLength(S):返回串S的元素個數,即串的長度。
	StrCompare(S,T):若S>T,返回值>0,若相等,返回0,若S<T,返回值<0Concat(T,S1,S2):用T返回由S1和S2連接而成的新串。
	SubString(Sub,S,pos,len):若串S存在,1<=pos<=StrLength(S),0<=len<=StrLength(S)-pos+1,用Sub返回串S的第pos個字符起長度爲len的子串。
	Index(S,T,pos):串S和T存在,T是非空串,1<=pos<=StrLength(S)。若主串S中存在和串T值相同的子串,則返回它在主串S中第pos個字符之後第一次出現的位置,否則返回0.
	Replace(S,T,V):串S、T和V存在,T是非空串。用V替換主串S中出現的所有與T相等的不重疊的子串。
	StrInsert(S,pos,T):串S和T存在,1<=pos<=StrLength(S)+1。在串S的第pos個字符之前傳入串T
	StrDelete(s,pos,len):串S存在,1<=pos<=StrLength(S)-len+1。從串S中刪除第pos個字符起長度爲len的子串。
endADT

下面以Index函數的實現爲例進行一個簡單說明。

/*T爲非空串。若主串中第pos個字符之後存在與T相等的子串,則返回第一個這樣的子串在S中的位置,否則返回0*/
int Index(String S,String T,int pos){
	int n,m,i;
	String sub;
	if(pos>0){
		//得到主串S的長度
		n = StrLength(S);
		//得到子串T的長度
		m=StrLength(T);
		i = pos;
		while(i<= n-m+1){
			//取主串第i個位置,長度與T相等子串給sub
			SubString(sub,S,i,m);
			if(StrCompare(sub,T) != 0){
				++i;
			}else{
				return i;
			}
		}
	}

	return 0;
}

串的存儲結構

串的順序存儲

串的順序存儲結構是用一組地址連續的存儲單元來存儲串中的字符序列的。按照預定義的大小,爲每個定義的串變量分配一個固定長度的存儲區。一般是用定長數組來定義。這種存儲方式通常是有問題的,因爲字符串的操作,如兩串的concat、新串的insert,以及字符串的替換replace,都有可能使得串序列的長度超過了數組的長度MaxSize。

串的鏈式存儲

對於串的鏈式存儲結構,與線性表相似,但由於串結構的特殊性,結構中的每個元素數據是一個字符,如果也簡單的應用鏈表存儲串值,一個結點對應一個字符就會存在很大的空間浪費。因此一個結點可以存放一個字符,也可以考慮存放多個字符,最後一個結點若是未被佔滿時,可以用“#”或其他非串值字符補全,如下:
串的鏈式存儲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章