第四章 1 串 串型別定義及串的表示和實現

2022-08-26 17:21:17 字數 3281 閱讀 7158

前言:

計算機上的應用程式幾乎都是以字串資料作為處理物件,然而,現今我們使用的計算機的硬體結構主要是反映數值計算的需要的,因此,在處理字串資料時比處理整數和浮點數要複雜得多。而且,在不同型別的應用中,所處理的字串具有不同的特點,要有效地實現字串的處理,就必須根據具體情況使用合適的儲存結構。這一章,我們將討論一些基本的串處理操作 和 幾種不同的儲存結構。

目錄: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.判...