資料結構 串

2021-08-02 07:34:06 字數 3267 閱讀 6679

串:

adt string

資料關係:r1=

基本操作:

strassign(&t,chars)

chars是字元常量。生成乙個其值等於chars的串t。

strcopy(&t,s)

串s存在則由串s複製得串t

strempty(s)

串s存在則若s為空串,返回真否則返回假

strcompare(s,t)

串s和t存在,若s>t,則返回值大於0,若s=t,則返回值=0,若s

strlength(s)

串s存在返回s的元素個數稱為串的長度.

clearstring(&s)

串s存在將s清為空串

concat(&t,s1,s2)

串s1和s2存在用t返回由s1和s2聯接而成的新串

substring(&sub,s,pos,len)

串s存在,1<=pos<=strlength(s)且0<=len<=strlength(s)-pos+1

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從串中刪除第pos個字元起長度為len的子串

destroystring(&s)

串s存在,則串s被銷毀

}adt string

串型別的定義

串(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 structhstring;

//生成乙個其值等於串常量 chars 的串t

status strassign(hstring &s,char * chars)

//if(s.ch)

if(!i)elsechunk;

typedef struct

注:設定尾指標的目的是 便於進行串的連線操作,但要注意連線時需處理第乙個串尾的無效字元(#)。

鏈式串中,結點的大小直接影響著串處理的效率。

儲存密度 = 串值所佔的儲存位 / 實際分配的儲存位  

對於固定的串a ,其串值儲存位是固定的,而實際分配的儲存位根據結點的大小而改變。

顯然當儲存密度最小時,(即結點大小為1)串的運算處理最方便,但是其占用的儲存量大。

總結:串的鏈式儲存,對鏈結操作等有一定的方便之處, 但總的來說不如另外兩種結構靈活,它占用儲存量大且操作複雜。

kmp匹配

隨便留點,好有個印象而已)

}int index_kmp(string s,string t,int pos)//返回字串t在主串s中第pos個字元之後的位置

else

j=next[j];

}if(j>t[0])

return i-t[0];

else

return 0;

}

改進後的kmp演算法

void get_nextval(string t,int *nextval)

{ int i,j;

i=1;j=0;

nextval[1]=0;

while(i

資料結構 串

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。第...

資料結構 串

串名 串值 串長 空串 空格串。字串的比較 字串模式匹配演算法 1.簡單字串模式匹配演算法 最簡單實現是用字串p的字元依次與字串t中的字元進行比較。實現思想是,首先將子串p從第0個字元起與主串t的第pos個字元起依次比較對應字元,如全部對應相等,則表明已找到匹配,成功終止。否則將子串p從第0個子串起...

資料結構 串

串 又稱字串 是一種特殊的線性表,它的每個結點僅由乙個字元組成。在早期的程式語言中,串僅在輸入或輸出中以直接量的形式出現,並不參與運算。隨著計算機的發展,串在文字編輯 詞法掃瞄 符號處理以及定理證明等許多領域得到越來越廣泛的應用。在高階語言中開始引入了串變數的概念,如同整型 實型變數一樣,串變數也可...