數據結構篇——串(String)

一、引入


? ? ? ? 在計算機中的處理的數據內容大致可分為以整形、浮點型等的數值處理和字符、字符串等的非數值處理。

? ? ? ? 今天我們主要學習的就是字符串數據。本章主要圍繞“串的定義、串的類型、串的結構及其運算”來進行串介紹與學習。

二、串的定義


2.1、串的基本定義


? ? ? ? 串(string)是由零個或多個字符組成的有限序列,也是一種內容受限的線性表。其特殊性體現在數據元素是一個字符。一般表示為:

S="abcdefg";

????????其中,S是串的名,雙引號內元素的個數為串的長度,0個元素的串被稱為空串,其長度為0;

Tips:字符串中的“空格”也算是串的一個元素,當一個串的元素只有空格時,這個串稱為“空格串”

2.2、子串以及串相等的條件


? ? ? ? 在一個串中,任意幾個連續字符所組成的序列稱之為該串的子串,包含子串的串叫做主串。子串在主串中的位置通常用子串的第一個字符在主串中的位置表示。

????????例如下圖的四個串:

?

? ? ? ? 它們的長度分別為3、4、7、8.且a、吧、都是c和d的子串。其中a在c、d中的位置都是1.而b在c中的位置為4,在d中的位置為5。

? ? ? ? 那么,怎么判斷兩個串是否相等呢?一般來說,只有當兩個串的長度相等且各個位置對應的字符都相等時才相等。像上圖中的a、b、c、d彼此都不相等。

三、串的類型定義和儲存結構


3.1、串的類型定義與基本操作


? ? ? ? 串的邏輯結構與先信標相似,但其基本操作的對象卻有較大的區別。串的操作主要集中在“子串”這樣的一個部分整體而不是單個元素。

其常見的基本操作如下:

函數初始條件操作結果
StrAssign(&T,chars)chars是字符串常量生成一個其值等于chars的串T
StrCopy(&T,S)串S存在由串S復制得到串T
StrEmpty(S)串S存在判斷串S是否為空串
StrCompare(S,T)串S、T存在比較S、T的大小。分別返回>0、=1、<0的值
StrLength串S存在返回串S的長度(元素個數)
ClearString串S存在將S清為空串
Concat(&T,s1,s2)串s1、s2存在將s1、s2拼接并由T返回
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存在,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的子串
DestoryString(&S)串S存在銷毀串S

3.2、串的儲存結構?


? ? ? ? 同其他數據結構一樣,串也是有著最為常見的兩種儲存結構——順序和鏈式。但考慮到存儲效率和算法方便性,串多采用鏈式存儲。

3.2.1、順序存儲


1、定長順序存儲:

? ? ? ? 類似于線性表,用一組地址連續的存儲單元存儲串值的字符序列,按照預定義的大小,為每個串變量分配一個固定長度的存儲區。則可用定長數組如下表示:

#define MAXLEN 255    //定義串的最大長度
typedef struct{char ch[MAXLEN+1];    //存儲串的一維數組int length;            //記錄串的長度
} SSting;

? ? ? ? 但這種存儲方式如同它的名字一樣,是存儲長度是固定的。串的實際長度只能小于等于MAXLEN,超過預定義長度的串值會被舍去,稱為截斷。串長有兩種表示方法: 一是如上述定義描述的那樣,用一個額外的變量len來存放串的長度;二是在串值后面加一一個不計入串長的結束標記字符“\0”,此時的串長為隱含值。

? ? ? ? 但是現實生活中所遇到的數據長度都是不固定的。這時候內存的動態分布就顯得格外重要。這時候就印出了一個新的順序存儲結構——堆分配存儲。

2、堆分配存儲:

????????在c語言中存在一個稱之為堆(Heap)的自由存儲區,可以為每個新產生的串動態分配一塊實際串長所需要的存儲空間,若分配成功,則返回指向起始地址的指針作為串的基址,同時為了方便處理,約定串長也作為存儲結構的一部分。定義如下:

typedef struct{char *ch;    //若是非空串,則按串長分配存儲區,否則ch為NULLint length;
}HString;

?3.2.2、鏈式存儲


? ? ? ? 在順序串中,我們發現,如果對其進行插入或者刪除操作就顯得十分麻煩。而鏈表結構在這方面就剛好能彌補這個弊端。但由于串的特殊性——結構中的每一個數據元素是一個字符,所以存在一個問題——每個結點中可以只存放一個字符,也可以存放多個字符。如圖所示

?

? ? ? ? 所以,當結點大小大于1時,由于串長不一定是結點大小的整數倍,所以鏈表中最后一個結點不一定全被串值占滿。此時通常補上“#”或其他非串值字符。

? ? ? ? 為了操作方便,當以鏈表存儲串值的時候,除頭指針外,還可附設一個尾指針指示鏈表中的最后一個結點,并給出當前串的長度。說明如下:

#define CHUNKSIZE 80        //定義塊大小//定義結點結構
typedef struct Chunk{char ch[CHUNKSIZE];struct Chunk *next;
}Chunk;typedef struct{Chunk *head,*tail;    //串的頭尾指針int length;        //串的長度
}LString

? ? ? ? 串值的鏈式存儲結構對某些串操作有一定的方便之處,但總體來說,不如順序結構靈活。它占用存儲量大且操作復雜。

四、小結?


? ? ? ? 本文主要介紹了串的定義及其存儲結構。涉及到的串的匹配算法相對比較重要,所以將單獨發布來學習。

????????如果我的內容對你有幫助,在下就厚著臉皮討個點贊關注。如果你有更好的想法,還望留在評論區讓我來參考學習。我將不勝感激并努力創作出更好的內容。? ? ? ? ?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897268.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【智能體架構:Agent】LangChain智能體類型ReAct、Self-ASK的區別

1. 什么是智能體 將大語言模型作為一個推理引擎。給定一個任務&#xff0c; 智能體自動生成完成任務所需步驟&#xff0c; 執行相應動作&#xff08;例如選擇并調用工具&#xff09;&#xff0c; 直到任務完成。 2. 先定義工具&#xff1a;Tools 可以是一個函數或三方 API也…

OmniParser技術分析(一)

1.引言 通過上篇文章介紹 OmniParser:下一代純視覺UI自動化測試先驅相信大家已經對OmniParser有初步了解&#xff0c;接下來詳細介紹下OmniParser使用了哪些技術模型實現了對UI純視覺的檢測和理解。 2.整體方案 通過閱讀OmniParser提供的運行Demo代碼知道&#xff0c;其實整…

設計心得——繼承和實例

一、繼承的應用場景 在上篇文章分析了繼承的應用&#xff0c;本文反過來講繼承和實例。可以理解對上文的繼承進行一下基礎知識的鋪墊&#xff0c;繼承的應用場景非常多&#xff0c;典型的應用場景包括&#xff1a; 1、單純屬性的繼承 這種繼承非常常見&#xff0c;在前面也舉過…

從連接到交互:SDN 架構下 OpenFlow 協議的流程與報文剖析

在SDN架構中&#xff0c;交換機與控制器之間的通信基于 OpenFlow協議&#xff0c;其設計目的是實現控制平面與數據平面的解耦。以下是 交換機連接控制器 和 數據包進入交換機觸發交互 的詳細流程及協議報文分析&#xff1a; 一、交換機連接控制器的流程&#xff08;初始化階段&…

opentitan riscv

OpenTitan?是一個開源的硅根信任&#xff08;Root of Trust, RoT&#xff09;項目&#xff0c;旨在使硅RoT的設計和實現更加透明、可信和安全&#xff0c;適用于企業、平臺提供商和芯片制造商。該項目由lowRISC CIC管理&#xff0c;作為一個協作項目&#xff0c;旨在生產高質量…

R語言使用scitable包交互效應深度挖掘一個陌生數據庫

很多新手剛才是總是覺得自己沒什么可以寫的&#xff0c;自己不知道選什么題材進行分析&#xff0c;使用scitable包后這個完全不用擔心&#xff0c;選題多到你只會擔心你寫不完&#xff0c;寫得不夠快。 今天演示一下使用scitable包深度挖掘一個陌生數據庫 先導入R包和數據 li…

電腦內存智能監控清理,優化性能的實用軟件

軟件介紹 Memory cleaner是一款內存清理軟件。功能很強&#xff0c;效果很不錯。 Memory cleaner會在內存用量超出80%時&#xff0c;自動執行“裁剪進程工作集”“清理系統緩存”以及“用全部可能的方法清理內存”等操作&#xff0c;以此來優化電腦性能。 同時&#xff0c;我…

C#控制臺應用程序學習——3.8

一、語言概述 1、平臺相關性 C# 主要運行在.NET 平臺上。.NET 提供了一個龐大的類庫&#xff0c;C# 程序可以方便地調用這些類庫來實現各種功能&#xff0c;如文件操作、數據庫訪問、網絡通信等。 2、語法風格 C# 的語法與 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

鴻蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation組件是路由導航的根視圖容器&#xff0c;一般作為Page頁面的根容器使用&#xff0c;其內部默認包含了標題欄&#xff0c;內容欄和公工具欄&#xff0c;其中內容區默認首頁顯示導航內容&#xff08;Navigation的子組件&#xff09;或非首頁顯示&am…

初階數據結構(C語言實現)——4.1棧

目錄 1.棧1.1棧的概念及結構1.2 棧的實現1.1.0 棧的初始化1.1.1 銷毀1.1.2 入棧1.1.3 出棧1.1.4 獲取棧中有效元素個數1.1.5 檢測棧是否為空&#xff0c;如果為空返回非零結果&#xff0c;如果不為空返回01.1.6 獲取棧頂元素1.1.7 驗證 附錄 棧的C語言實現源碼.h文件.c文件test…

計算光學成像與光學計算概論

計算光學成像所涉及研究的內容非常廣泛&#xff0c;雖然計算光學成像的研究內容是發散的&#xff0c;但目的都是一致的&#xff1a;如何讓相機記錄到客觀實物更豐富的信息&#xff0c;延伸并擴展人眼的視覺感知。總的來說&#xff0c;計算光學成像現階段已經取得了很多令人振奮…

什么樣的物聯網框架適合開展共享自助KTV唱歌項目?

現在物聯網的廣泛應用&#xff0c;也讓更多用戶們看到了它的實力&#xff0c;也使得共享經濟遍地開花。其中共享自助唱歌設備也備受歡迎&#xff0c;那么適合開展共享自助KTV唱歌項目的物聯網框架都應具備哪些特點呢&#xff1f; 智能化與自動化管理 物聯網技術在共享KTV中的應…

機器視覺選型中,不同焦距的鏡頭成像視野有什么不同?

不同焦距的鏡頭成像視野的差異主要體現在視角范圍和透視效果上。焦距越長&#xff0c;視角越窄&#xff0c;能捕捉的景物范圍越小&#xff1b;焦距越短&#xff0c;視角越廣&#xff0c;覆蓋的景物范圍越大。以下是具體分析&#xff1a; 焦距與視角的關系 焦距&#xff08;Foc…

Linux16-數據庫、HTML

數據庫&#xff1a; 數據存儲&#xff1a; 變量、數組、鏈表-------------》內存 &#xff1a;程序運行結束、掉電數據丟失 文件 &#xff1a; 外存&#xff1a;程序運行結束、掉電數據不丟失 數據庫&#xff1a; …

開源訂貨系統哪個好 三大訂貨系統源碼推薦

在數字化轉型加速的今天&#xff0c;企業對訂貨系統的需求日益增長。一款優質的訂貨系統源碼不僅能提升供應鏈效率&#xff0c;還能通過二次開發滿足個性化業務需求。這里結合 “標準化、易擴展” 兩大核心要求&#xff0c;為您精選三款主流訂貨系統源碼&#xff0c;助您快速搭…

行為模式---迭代器模式

概念 迭代器模式是設計模式的行為模式&#xff0c;它的主要設計思想是提供一個可以操作聚合對象&#xff08;容器或者復雜數據類型&#xff09;表示&#xff08;迭代器類&#xff09;。通過迭代器類去訪問操作聚合對象可以隱藏內部表示&#xff0c;也可以使客戶端可以統一處理…

Maven的學習以及安裝配置 2024/3/1 idea

1. Maven的安裝 1.1 首先查看編程工具合適的Maven版本 我使用的是2024/3/1 版本的idea&#xff0c;接下來我會用這個版本的idea進行演示。idea沒有漢化的也可以參考我的步驟。 1、打開idea的設置&#xff0c;搜索Maven&#xff0c;進入Maven設置。 我們可以看到&#xff0c;…

基于 Docker 的跨平臺鏡像構建與增量更新實戰指南

引言&#xff1a;破解容器化兩大核心問題 在實際開發中&#xff0c;我們常常面臨兩個棘手問題&#xff1a; 跨平臺兼容性&#xff1a;如何在Windows平臺開發的鏡像&#xff0c;無縫運行在 ARM64 服務器&#xff1f;更新效率低下&#xff1a;每次代碼調整都要重新安裝全部依賴…

支付通道開通對接一般需要多少錢

不少老板都想開通AIP線上接口&#xff0c;但是不知道這個成本到底是多少? 其實目前第三方支付公司對外提供了標準的線上接入技術方案&#xff0c;一般以API、SDK等形式。因此&#xff0c;商戶在完成簽約審核后&#xff0c;可以順利拿到技術的密鑰&#xff0c;正常調用第三方支…

什么是 spring 的循環依賴?

什么是 spring 的循環依賴&#xff1f; 首先&#xff0c;認識一下什么是循環依賴&#xff0c;舉個例子&#xff1a;A 對象被 Spring 管理&#xff0c;并且引入的 B 對象&#xff0c;同樣的 B 對象也被 Spring 管理&#xff0c;并且也引入的 A 對象。這種相互被引用的情況&#…