前言:
計算機上的應用程式幾乎都是以字串資料作為處理物件,然而,現今我們使用的計算機的硬體結構主要是反映數值計算的需要的,因此,在處理字串資料時比處理整數和浮點數要複雜得多。而且,在不同型別的應用中,所處理的字串具有不同的特點,要有效地實現字串的處理,就必須根據具體情況使用合適的儲存結構。這一章,我們將討論一些基本的串處理操作 和 幾種不同的儲存結構。
目錄:1.串型別的定義
2.串的表示和實現
2.1.定長順序儲存表示
2.2.堆分配儲存表示
2.3.串的塊鏈儲存表示
3.串的模式匹配演算法
4.串操作應用劇烈
正文:串型別的定義
串(string)(或字串)是由 零個或多個字元 組成的有限序列,一般記為:
s=' a1a2...an '
注意:由乙個或多個空格組成的串,稱為空格串。而不是空串。
串 和 字串行(char * ='hello')的區別:
串是一種資料結構,是字元的集合,實現並提供對這種集合操作的各種方法。
char 是c 的一種基本資料型別,沒有已實現的對字串行的複雜操作。
串的邏輯結構和線性表極為相似,區別在於:
1.串的資料物件約束為字符集。
串的表示及實現
串有3種機內表示方法:
1.定長順序儲存 表示
類似於線性表的順序儲存結構,用一組位址連續的儲存單元儲存串值的字串行。在串的定長順序儲存結構中,按照預定義的大小,為每個定義的串變數分配乙個固定長度的儲存區,則可用定長陣列如下描述之。
儲存表示:
#define maxstrlen 255 //定義最大串長
typedef unsigned char sstring [maxstrlen +1]; //0單元存放串的長度
串的實際長度可在這預定義長度的範圍內隨意, 超出的部分被捨棄,稱之為 「截斷」 。
弊端:當合併兩個 串的時候,如果長度超過 預定義最大串長maxstrlen ,其它部分將會丟失即 「截斷」。
解決方案:使用不限定串長的最大長度, 即動態分配串值的儲存空間。
2.堆分配儲存表示
在 c 語言中,存在乙個稱之為 「堆」 的自由儲存區, 並由c 語言的動態分配函式 malloc() 和 free()來管理。利用malloc 函式為每個新產生的串分配一塊實際串長所需的儲存空間,若分配成功,則返回乙個指向起始位址的指標,作為串的基址,同時,為了處理方便,約定串長也作為儲存結構的一部分。
堆分配儲存表示:
typedef struct hsring;
**實現:
#include#include執行結果:#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#define maxqsize 5
//status是函式的型別,其值是函式結果狀態碼
typedef int
status;
typedef
struct
hstring;
//生成乙個其值等於串常量 chars 的串t
status strassign(hstring &s,char *chars)
//if(s.ch)
if(!i)
else
return
ok;}
//返回串長度
int strlength(hstring &s)
//比較大小,若 s>t 返回值》0。相等 返回0 ,否則返回 <0
intstrcompare(hstring s,hstring t)
return s.length-t.length;}//
清空串s為空串,並釋放所佔空間
status clearstring(hstring &s)
s.length=0
;
return
ok;}
//連線兩個字串,生成乙個新的字串
status concat(hstring &t,hstring s1,hstring s2)
//字串擷取,返回擷取的串
status substring(hstring &sub,hstring s,int pos,int
len)
void printv(hstring &s)
}void prints(hstring &s)
printf(
"%s\n
","");}
void
main()
串的表示和實現
串的塊鏈儲存表示:
和線性表的鏈式儲存表示相似,串也可以採用鍊錶方式儲存串值。由於串結構的特殊性,儲存時乙個結點可以存放乙個字元也可以存放多個字元。
當結點大小大於1時,由於 串值可能不是結點大小的整數倍,則鍊錶最後乙個結點可能無法填滿,此時通常補上 「#」 或其他非串值 字元。如下圖:
定義:為了便於進行串的操作,當以鍊錶儲存串值時,除頭指標外還可附設乙個尾指標指示鍊錶中的最後 乙個結點,並給出當前串的長度,稱如此定義的串儲存結構為塊鏈結構。
串的塊鏈儲存表示
#define chunksize 80; //結點大小,使用者自己隨便定義
typedef struct chunkchunk;
typedef struct{
chunk *head,*tail; //串的頭指標,和尾指標
int curlen; //串的長度
注:設定尾指標的目的是 便於進行串的連線操作,但要注意連線時需處理第乙個串尾的無效字元(#)。
鏈式串中,結點的大小直接影響著串處理的效率。
儲存密度 = 串值所佔的儲存位 / 實際分配的儲存位
對於固定的串a ,其串值儲存位是固定的,而實際分配的儲存位根據結點的大小而改變。
顯然當儲存密度最小時,(即結點大小為1)串的運算處理最方便,但是其占用的儲存量大。
總結:串的鏈式儲存,對鏈結操作等有一定的方便之處, 但總的來說不如另外兩種結構靈活,它占用儲存量大且操作複雜。
第四章作業 串
1 1 函式strcmp從頭至尾順序地將其對應字元比較,遇到兩個字元不等時,兩個字元相減得到乙個int型值,兩個字串完全相同時,則返回0。1分 t 1 2c 語言中 字串常量最後乙個字元是結束標誌 該結束符是 0 1分 t 1 3char s c language 表示s是乙個指向字串的指標變數,把...
第四章字串
樸素的串匹配演算法 評價 簡單易懂,但效率低下。演算法時間複雜度o m n 樸素演算法的執行過程,設目標串 t ababcabcacbab,模式串 p abcac 樸素的串匹配演算法 def matching t,p m,n len p len t i,j 0,0 while i m and j n...
OC 第四章 字串
第四章 字串 oc字串 unichar unicode碼 組成 c語言 ascii碼 不可變字串 nsstring 自身的長度以及內容都是不可變的 1.建立字串的五種方式 2.字串的常用方法 nsstring str4 str substringwithrange range 4.字串的拼接 5.判...