從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。
串是重要的非數值處理物件,它是以字元作為資料元素的線性表。
串:即字串,是由零個或多個字元組成的有限序列,是資料元素為單個字元的特殊線性表。
若干術語:
串長:串中字元個數(n≥0), n=0 時稱為空串 。
空白串:由乙個或多個空格符組成的串。
字元位置:字元在串中的序號。
串相等:串長度相等,且對應位置上字元相等。
子串:串中任意個連續的字元組成的子串行。
主串:包含子串的串。
子串的位置:子串的第乙個字元在主串中的序號。
串的資料物件約束為某個字符集。
微機上常用的字符集是標準ascii碼,由 7 位二進位制數 表示乙個字元,總共可以表示 128 個字元。擴充套件ascii 碼由 8 位二進位制數表示乙個字元,總共可以表示 256 個 字元,足夠表示英語和一些特殊符號,但無法滿足國際需要。 unicode碼由 16 位二進位制數表示乙個字元,總共可以表示2的16次方個字元,即6萬5千多個字元,能夠表示世界上所有語言的所有字元,包括亞洲國家的表意字元。為了保持相容性,unicode字符集中的前256個字元與擴充套件ascii碼完全相同。
adt string
資料關係:
r1=基本操作:
初始條件:串 s 和 t 均存在,1≤pos≤strlength(s)+1。
操作結果:在串 s 的第 pos 個字元之前插入串t。
例如:s = "chater",t = "rac", 則執行 strinsert (s, 4, t) 得到 s = "character"
strdelete (&s, pos, len) (刪除)
初始條件:串 s 存在,且1≤pos≤strlength(s)-len+1。
操作結果:從串 s 中刪除第 pos 個字元起長度為len的子串。
strassign (&t, chars) (串賦值)
初始條件:chars 是字串常量。
操作結果:把 chars 賦為 t 的值。
strcopy (&t, s) (串複製)
初始條件:串 s 存在。
操作結果:由串 s 複製得串 t。
concat (&t, s1, s2) (串聯接)
初始條件:串 s1 和 s2 存在。
操作結果:t 為由串 s1 和串 s2 聯接所得的串。
例如: concat( t, "man", "kind") 求得 t = "mankind" concat( t, "kind", "man") 求得 t = "kindman"
strcompare (s, t) (串比較)
初始條件:串 s 和 t 都存在。
操作結果:若串 s > t, 則返回值》0;若s=t, 則返回值=0;若串 s
例如:strcompare("data", "state") 0
replace ( s, t, v) (串置換)
初始條件:串 s, t 和 v 均已存在,且 t 是非空串。
操作結果:用 v 替換主串 s 中出現的所有與(模式串)t 相等的不重疊的子串。
例如: 假設 s = "abcaabcaaabca", t = "bca"
若 v = "x", 則經置換後得到 s = "axaxaax"
若 v = "bc", 則經置換後得到 s = "abcabcaabc"
substring (&sub, s, pos, len) (求子串)
初始條件:
串 s 存在,1≤pos≤strlength(s) 且 0≤len≤strlength(s)-pos+1。
操作結果: 以 sub 返回串 s 中第 pos 個字元起長度為 len 的子串。
例如: substring ( sub, "commander", 4, 3)
求得 sub = "man"
substring( sub, "commander", 1, 9)
求得 sub = "commander"
substring( sub, "commander", 9, 1)
求得 sub = "r"
index ( s, t, pos) (定位函式)
初始條件:串 s 和 t 存在,且 t 是非空串, 1≤pos≤strlength(s)。
操作結果:若主串 s 中存在和串 t 值相同的子串,則返回它在主串 s 中第 pos個字元起第一次出現的位置; 否則函式值為0。
假設 s = "abcaabcaaebc", t = "abc"
index(s, t, 1) = 1;
index(s, t, 3) = 5;
index(s, t, 8) = 0;
串和線性表的區別
串的邏輯結構和線性表極為相似,區別僅在於串的資料物件約束為字符集。
串的基本操作和線性表有很大差別。
而在串的基本操作中,通常以「串的整體」作為操作物件。
串的表示和實現
定長順序儲存特點:
用一組連續的儲存單元來存放串,直接使用定長的字元陣列來定義,陣列的上界預先給出,故稱為靜態儲存分配。
例如:
#define maxstrlen 255 //使用者可用的最大串長
typedef unsigned char sstring[ maxstrlen+1 ] ;
sstring s; //s是乙個可容納255個字元的順序串。
注: 一般用sstring[0]來存放串長資訊;
c語言約定在串尾加結束符 『 \0』,以利操作加速,但不計入串長;
若字串超過maxstrlen 則自動截斷(因為靜態陣列存不 進去)。
如果想要存放超長的字串,靜態陣列有缺陷,改用動態分配的一維陣列----------堆
堆分配儲存特點:
仍用一組連續的儲存單元來存放串,但儲存空間是在程式執行過程中動態分配而得。
思路:利用malloc函式合理預設串長空間。
特點: 若在操作中串值改變,還可以利用realloc函式按新串長度增加(堆砌)空間。
約定:所有按堆儲存的串,其關鍵資訊放置在:
typedef struct hstring
用「堆」實現串插入操作
status strinsert ( hstring &s, int pos, hstring t )
return ok;
}//strinsert
堆分配儲存表示
比較字串是否相同
int strcompare ( hstring s, hstring t )
s.length = 0;
return ok;
} // clearstring
聯接兩個串成新串
status concat ( hstring &t, hstring s1, hstring s2 ) // concat
求子串
status substring ( hstring &sub, hstring s, int pos, int len ) // 空子串
塊鏈型別定義:
#define chunksize 80 //可由使用者定義的塊大小
typedef struct chunk chunk;
typedef struct lstring; //串型別只用一次,前面可以不加lstring
注:
串與線性表的運算有所不同,是以「串的整體」作為操作物件,例如查詢某子串,在主串某位置上插入乙個子串等。
這類操作中均涉及到定位問題,稱為串的模式匹配。它是串處理系統中最重要的操作之一。
關於串的模式匹配敬請期待。
申明:備考期末,如果不到之處,敬請指出,感激不盡。
電腦的基礎知識 電腦的基礎知識
電腦的組成部分與其作用 一 軟體系統 軟體系統的組成分別是 作業系統 應用軟體等。其應用軟體是指特定領域開發 並為特定目的服務的一類軟體。而作業系統是位於底層硬碟與使用者之間溝通的橋梁。使用者可以通過作業系統的使用者頁面,輸入命令,實現使用者需求。二 硬體系統 硬體系統是指構成計算機的物理裝置,即由...
電腦的基礎知識 電腦的基礎知識介紹
起尾我們需相識電腦的底子形成著名我們顧到的電腦皆是由 主機 次要部分 輸出裝置 矯飾器 輸出裝置 鍵盤戰滑鼠 三年夜件形成。而主機是電腦的主體,正在主機箱中有 主機板 cpu 記憶體 電源 音卡 音效卡 網絡卡 軟盤 軟碟機 光碟機等軟體。從底子機挨開往道,電腦不妨分為五年夜部分 運算器 記憶體器 ...
C 的基礎知識
一 請填寫bool float,指標變數與 零值 比較的if 語句。if n 0 if n 0 以次類推 請寫出bool flag與 零值 比較的 if 語句 if flag 請寫出 float x 與 零值 比較的 if 語句 const float espon 0.000001 if x esp...