4-數據結構-串的學習

4.1串類型的定義

1.串:(或字符串)

串是由多個字符組成的有限序列,記作:S=‘c1c2c3…cn’ (n>0)

其中S是串的名字,‘c1c2c3…cn’ 是串值
ci是串中字符
n是串的長度,表示字符的數目

空串:零個字符的串稱為空串,記作“”(空)

2.子串

子串:串中任意連續字符組成的子序列
主串:包含子串的串

注意:空串是任意串的子串,任意串是他自身的子串。除它本身外,一個串的其他子串都是它的真子串

*字符在串中的位置:字符在序列中的序號
*子串在串中的位置:子串的第一個字符在子串中的位置

3.串相等

兩個串長度相等且各個對應位置的字符串都相等時才相等

4.空格串

由一個或多個空格組成的串,長度不為0

【串和線性表的區別:
1:數據對象:串的約束對象為字符集
2 串的操作:線性表大多以“單個元素”為操作對象;串通常以“串的整體”作為操作對象

4.2.1串的表示和實現

【1.定長順序存儲表示
*靜態分配:為每個串預先分配一個固定長度的存儲區域

*用定長數組描述
#define MAXSTRLEN 255 //最大串長
typedef unsigned char SString[MAXSTRLEN+1]
// +1個單元為 0號單元存放串的長度

【圖】在這里插入圖片描述

【串的連接:

status Concat(SSting&T,SString S!,SString S2)
{//用T返回由S1和S2連接而成的新串。若未截斷,則返回TURE,否則返回FALSEif(S1[0]+S2[0]<=MAXSTRLEN)\
{//未截斷T[1,...,S1[10]]=S1[1,....S1[0]];       //S1[0]表示S1的0號單元,里面是串的長度  T[S1[0]+1,...,S2[0]+S2[0]];T[0]=S1[0]+S2[0];   //長度之和uncut=TURE;   //未截斷
}else if(S1[0]<MAXSTRSIZE) 
{//截斷T[1,...,S1[10]]=S1[1,....S1[0]];      T[S1[0]+1,...,MAXSTRLEN]=S2[1,...,MAXSTRLEN-S1[0] ];    //裝不下,只截取了S2的一部分T[0]=MAXSTRLEN;  uncut=FALSE;  
}return uncat;
} //Concat
}

【求子串:

status SubString(SString &Sub,SString S,int pos,int len)
{//用sub返回串的第pos個字符起長度為len的子串//其中,1<=pos<=StrLength(S) 且0<=len<=StrLength(S)-pos+1if (pos<1||pos>S[0]||len<0||len>S[0]-pos+1)return ERROR;   //不合法Sub[1..len]=S[pos..pos+len-1];   //從S的第pos位置開始,取長度為len的子串
Sub[0]=len;    //子串的長度
return OK;}

【總結:
操作特點:
1.實現串操作特點的原操作為:“字符序列的復制”
2.在操作中當出現串的長度超過MAXSTRLEN時,約定用截斷法處理

4.2.2串的表示和實現

2.堆分配存儲表示

動態分配

仍以一組地址連續的存儲單元存放串值字符序列,但存儲空間是在程序執行過程中動態分配而得的,也稱為【動態存儲分配的順序表】。用malloc()和free()來分配和釋放

堆分配的存儲表示
typedef struct 
{char *ch;    //地址指向存儲空間 按需分配//若是非空串,則按串實用長度分配存儲區,否則ch為NULLint lentgh;   //串長度} HString;    
串插入
status strInsert(HString &S,int pos,HString T)
//在串S的第pos個位置前插入串T
{ int i;if(pos<1||pos>S.length+1)    //判斷合法范圍return ERROR;if(T.length)            //判斷是否為0{if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))    //S和T的長度之和exit(OVERFLOW);    //分配失敗溢出for(i=S.length-1;i>=pos-1;--1)     //length-1是節點序數,因為長度有一個0節點{ S.ch[i+T.length]=S.ch[i];}for(i=0;i<=T.length-1;i++)S.ch[pos-1+i]=T.ch[i];S.length+=T.length;}return OK;
}
求串長

int StrLength(HString S)
//求串長
{return S.length
}
串比較

int StrCompare(HString S,HString T)
//比較兩個串,若相等返回0
{int i;for (i=0;i<S.length && i<T.length; i++)if (S.ch[i]!=T.ch[i])return S.ch[i]-T.ch[i];return S.length-T.length;
}
串清空
status ClearString(HString &S)
//將S清空為空串
{if(S.ch){free(S.ch);S.ch=NULL;}S.length=0;return OK;
}
串連接
status Concat(HString &S,HString S1,HString S2){
int j;
if(!(S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))exit(OVERFLOW);
for (j=0;j<=S1.length-1;j++){S.length=S1.length+S2.length;}
for(j=0;j<=S2.length-1;j++){  S.ch[S1.length+j]=S2.ch[j];}
return OK;
}
求子串
status StubString(HString &Sub,HString S,int pos,int len)
// 用Sub返回串S的dipos個字符開始長度為len的子串
{if(pos<1||pos>S.length||len<0||len>S.length-pos+1)return ERROR;if(!len) {Sub.cn=NULL;Sub.length=0;}else{sub.ch=(char*)malloc(len*sizeof(char));for(int j=0;j<=len-1;j++){Sub.ch[j]=S.ch[pos-1+j];}
Sub.length=len;
}
return OK;

4.3串的模式匹配算法

4.3.1 BF算法
模式匹配:

在這里插入圖片描述
在這里插入圖片描述

算法:
int Index(SString S,SString T,int pos)
{
i=pos;j=1;
while(i<=S[0]&&j<=T[0])  //判斷合法范圍{if(S[i]==T[j]) {++i;++j;}else{i=i-j+2; j=1;}}
if(j>T[0])  return i-T[0];
else return 0;
}
時間復雜度:

最好情況:
在這里插入圖片描述
最壞情況:
在這里插入圖片描述

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

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

相關文章

Linux下rm誤刪恢復 extundelete

Linux下rm誤刪恢復 extundelete 誤刪之后要第一時間卸載&#xff08;umount&#xff09;該分區&#xff0c;或者以只讀的方式來掛載&#xff08;mount&#xff09;該分區&#xff0c;否則覆寫了誰也沒辦法恢復。如果誤刪除的是根分區&#xff0c;最好直接斷電&#xff0c;進入…

5-數據結構-數組的學習

5.1數組的定義 定義&#xff1a; 由一組類型相同的數據元素構成的有序集合&#xff0c;每個數據元素稱為一個數據元素&#xff08;簡稱元素&#xff09;&#xff0c;每個元素受n&#xff08;n>1&#xff09;個線性關系的約束&#xff0c;每個元素在n個線性關系中的序號i1、…

timm 視覺庫中的 create_model 函數詳解

timm 視覺庫中的 create_model 函數詳解 最近一年 Vision Transformer 及其相關改進的工作層出不窮&#xff0c;在他們開源的代碼中&#xff0c;大部分都用到了這樣一個庫&#xff1a;timm。各位煉丹師應該已經想必已經對其無比熟悉了&#xff0c;本文將介紹其中最關鍵的函數之…

C--數據結構--樹的學習

6.2.1二叉樹的性質 1.二叉樹 性質&#xff1a; 1.若二叉樹的層次從1開始&#xff0c;則在二叉樹的第i層最多有2^(i-1)個結點 2.深度為k的二叉樹最多有2^k -1個結點 &#xff08;k>1&#xff09; 3.對任何一顆二叉樹&#xff0c;如果其葉結點個數為n0,度為2的非葉結點個數…

TVM:使用 Schedule 模板和 AutoTVM 來優化算子

TVM&#xff1a;使用 Schedule 模板和 AutoTVM 來優化算子 在本文中&#xff0c;我們將介紹如何使用 TVM 張量表達式&#xff08;Tensor Expression&#xff0c;TE&#xff09;語言編寫 Schedule 模板&#xff0c;AutoTVM 可以搜索通過這些模板找到最佳 Schedule。這個過程稱為…

TVM:使用 Auto-scheduling 來優化算子

TVM&#xff1a;使用 Auto-scheduling 來優化算子 在本教程中&#xff0c;我們將展示 TVM 的 Auto-scheduling 功能如何在無需編寫自定義模板的情況下找到最佳 schedule。 與基于模板的 AutoTVM 依賴手動模板定義搜索空間不同&#xff0c;auto-scheduler 不需要任何模板。 用…

C語言—sort函數比較大小的快捷使用--algorithm頭文件下

sort函數 一般情況下要將一組數從的大到小排序或從小到大排序&#xff0c;要定義一個新的函數排序。 而我們也可以直接使用在函數下的sort函數&#xff0c;只需加上頭文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

散列的使用

散列 散列簡單來說&#xff1a;給N個正整數和M個負整數&#xff0c;問這M個數中的每個數是否在N中出現過。 比如&#xff1a;N&#xff1a;{1,2,3,4}&#xff0c;M{2,5,7}&#xff0c;其中M的2在N中出現過 對這個問題最直觀的思路是&#xff1a;對M中每個欲查的值x&#xff0…

關于C++中的unordered_map和unordered_set不能直接以pair作為鍵名的問題

關于C中的unordered_map和unordered_set不能直接以pair作為鍵名的問題 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于紅黑樹實現的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希實現的&#xff0c;在不要求容器內的鍵有序&#xff0c…

AI編譯器與傳統編譯器的聯系與區別

AI編譯器與傳統編譯器的區別與聯系 總結整理自知乎問題 針對神經網絡的編譯器和傳統編譯器的區別和聯系是什么&#xff1f;。 文中提到的答主的知乎主頁&#xff1a;金雪鋒、楊軍、藍色、SunnyCase、貝殼與知了、工藤福爾摩 筆者本人理解 為了不用直接手寫機器碼&#xff0…

python學習1:注釋\變量類型\轉換函數\轉義字符\運算符

python基礎學習 與大多數語言不同&#xff0c;python最具特色的就是使用縮進來表示代碼塊&#xff0c;不需要使用大括號 {} 。縮進的空格數是可變的&#xff0c;但是同一個代碼塊的語句必須包含相同的縮進空格數。 &#xff08;一個tab4個空格&#xff09; Python語言中常見的…

Python、C++ lambda 表達式

Python、C lambda 表達式 lambda函數簡介 匿名函數lambda&#xff1a;是指一類無需定義標識符&#xff08;函數名&#xff09;的函數或子程序。所謂匿名函數&#xff0c;通俗地說就是沒有名字的函數&#xff0c;lambda函數沒有名字&#xff0c;是一種簡單的、在同一行中定義函…

python 學習2 /輸入/ 輸出 /列表 /字典

python基礎學習第二天 輸入輸出 xinput("輸入內容") print(x)input輸出&#xff1a; eval :去掉字符串外圍的引號&#xff0c;按照python的語法執行內容 aeval(12) print(a)eval輸出樣式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;刪去…

Linux、Mac 命令行快捷鍵

Linux、Mac 命令行快捷鍵 Linux 命令行編輯快捷鍵&#xff0c;參考了好多個&#xff0c;應該算是比較全的了&#xff0c;Linux 和 Mac 的都有&#xff0c;筆者本人比較常用的也已經紅色標出來了&#xff0c;如有錯誤或遺漏&#xff0c;歡迎留言指出。 光標移動及編輯&#xff…

Python 命令行傳參

Python 命令行傳參 說到 python 命令行傳參&#xff0c;可能大部分人的第一反應就是用 argparse。的確&#xff0c;argparse 在我們需要指定多個預設的參數&#xff08;如深度學習中指定模型的超參數等&#xff09;時&#xff0c;是非常有用的。但是如果有時我們只需要一個參數…

快速排序 C++

快速排序 C 本文圖示借鑒自清華大學鄧俊輝老師數據結構課程。 快速排序的思想 快速排序是分治思想的典型應用。該排序算法可以原地實現&#xff0c;即空間復雜度為 O(1)O(1)O(1)&#xff0c;而時間復雜度為 O(nlogn)O(nlogn)O(nlogn) 。 算法將待排序的序列 SSS 分為兩個子…

Linux命令行下感嘆號的幾個用法

Linux命令行下 " ! " 的幾個用法 ! 在大多數編程語言中表示取反的意思&#xff0c;但是在命令行中&#xff0c;他還有一些其他的神奇用法。熟練掌握這些用法&#xff0c;可以大大提高我們日常命令行操作的效率。 1 執行歷史命令 !! ! 在命令行中可以用來執行歷史…

三地址碼簡介

三地址碼簡介 三地址碼&#xff08;Three Address Code&#xff09;是一種最常用的中間語言&#xff0c;編譯器可以通過它來改進代碼轉換效率。每個三地址碼指令&#xff0c;都可以被分解為一個四元組&#xff08;4-tuple&#xff09;的形式&#xff1a;&#xff08;運算符&am…

llvm與gcc

llvm與gcc llvm 是一個編譯器&#xff0c;也是一個編譯器架構&#xff0c;是一系列編譯工具&#xff0c;也是一個編譯器工具鏈&#xff0c;開源 C11 實現。 gcc 相對于 clang 的優勢&#xff1a; gcc 支持更過語言前端&#xff0c;如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手區解題 view_source / robots / backup

1**. view_source** 題目描述&#xff1a;X老師讓小寧同學查看一個網頁的源代碼&#xff0c;但小寧同學發現鼠標右鍵好像不管用了。 f12查看源碼即可發現flag 2. robots 題目描述&#xff1a;X老師上課講了Robots協議&#xff0c;小寧同學卻上課打了瞌睡&#xff0c;趕緊來教教…