資料結構之串的基本操作

2021-08-20 08:42:27 字數 4049 閱讀 6553

(1)串基本術語:

空串:空串指長度為0的串,其不包含任何字元;

空格串:不同於空串,它是由乙個或多個空格構成的串。雖然是空格,但在計算長度時要把空格的個數算在內;

串比較:串的大小比較時以字元的ascii碼值作為依據。

(2)串基本操作:賦值操作、連線操作、求串長、竄的比較和求子串。

(3)串的儲存結構:順序儲存和鏈式儲存。其中鏈式儲存可以指定節點大小,儲存若干個字元。

2.串的模式匹配演算法:求解子串在主串中首次出現的位置:index(s,t,pos)

演算法的實現使具有暴力的性質,模式串和主串同時從第乙個位置開始進行判斷,若對應位置字元相等則繼續向後判斷,若不相

等,則模式串回到串首,主串字元位置指標回退,重新匹配。

int index(string s,string t,int pos)

else

}if(j>t.length)

else

return 0;

串的模式匹配演算法優化:kmp演算法

此演算法可以在o(m+n)的數量級上完成串的匹配操作。其改進在於,每一趟匹配過程中出現字元比較不相等的時候,不需要回

退指標i,而是利用已經匹配到的部分結果將模式串向右滑動盡可能遠的距離,繼續匹配。

#include

#include

using namespace std;

#define maxstrlen 100

typedef char sstring[maxstrlen+1];

//返回模式串t在主串中第pos位置之後的位置,若存在,返回1,否則返回0

int kmpindex(sstring s,sstring t,int pos)else

}if(j >t[0]) return i-t[0];

return 0;

}//求子串next[i]的值

void getnext(sstring t,int next)

int main()

;  sstring t = ;  

int pos;  

pos = kmpindex( s,  t, 1);  

cout<<"匹配位置為:"<

3.順序串與鏈式串的實現(c語言)

(1)順序串:

#include

#include

#include

using namespace std;

#define maxsize 100

//串的順序儲存

typedef struct ststring;

//1.串的初始化操作

string createnullstring()

//2.判斷空串

int isempty(string str)else

}//3.串的賦值操作

void strassign(string *str1,char str2)

str1->length = i;

for(i=0;ilength;i++)

}//4.串的拷貝

void strcopy(string *str1,string str2)

str1->length = str2.length;

int i;

for(i=0;ilength;i++)

} //5.串的長度

int strlength(string str)

//6.串的連線操作

void strconcat(string *str,string str1,string str2)

str->length = str1.length+str2.length;

int i;

for(i=0;ich[i] = str1.ch[i];

}//將str1賦值到str

for(;ilength;i++)//將str2賦值到str

} //7.取子串

int substr(string s,int i,int len,string *t)

t->length = len;

int k;

for(k=0;klength;k++)

return 1;

}//8.插入操作

int insertstring(string *str,int i,string str1)

int k;

for(k=str->length-1;k>=i-1;k--)

str->length = str->length + str1.length;

for(k=0;kch[k+i-1] = str1.ch[k];

}return 1;

} //9.刪除子串

int deletestr(string *str,int i,int len)

int k;

for(k=i+len-1;klength;k++)

str->length -= len;

return 1;

} //10.輸出操作

void print(string *str)

coutint i=pos;

int j=0;

while(i<=s.length && j<=t.length)

else

}if(j>t.length)

else

return 0;

} int main()

node,*linkstr;

//1.初始化乙個空串

linkstr createnullstring()

return str;

}//2.判斷空串

int isempty(linkstr str)

else

} //3.賦值操作

void stringassign(linkstr str,char t)

else

r->next = null;

//將s中多餘的空間釋放掉

while(q!=null) }}

//2.串的拷貝

void assign(linkstr s,linkstr t)

else

//p節點後移

p=p->next;

//同理,若q的長度過長,可以釋放多餘的空間

while(q!= null)

r->next = null;}}

//3.求串長

int length(linkstr s)

return len;

}//4.串的鏈結操作

void contact(linkstr s,linkstr s1,linkstr s2)

else

p=p->next;

}p=s2->next;

while(p!=null)else

p=p->next;

}//將串s的多餘的空間清除掉(這個情況只可能發生在while的if迴圈中)

while(q!=null)

r->next = null;

}  //5.擷取子串

int substring(linkstr s,int i,int len,linkstr t)

for(k=0,r=t,q=t->next;kch=p->ch;

r=q;

q=q->next;

}else

p=p->next;

}while(q!=null)

r->next=null;

return 1;

} //6.插入子串操作

int insert(linkstr s,int i,linkstr t)

q=t->next;

while(q!=null)

return 1;

}//7.刪除操作

int deletestr(linkstr s,int i,int len)

for(j=0;jnext;

p->next=q->next;

free(q);

}return 1;

}//8.列印輸出

void print(linkstr s)

cout<

資料結構 實驗 串的基本操作

一 實現主要功能為 1 輸入模式串 目標串 2 根據目標串生成next和nextval陣列 3 根據next或者nextval進行匹配。二 程式截圖 三 1 include 2 include 3 include 4 include 5 using namespace std 67 define m...

資料結構之棧的基本操作

棧的結構型別,和基本操作如下 typedef struct stack,st void initstack stack s 初始化棧 void destroystack stack s 銷毀棧 void push stack st,type e 插入元素 type pop stack st 彈出棧頂...

資料結構之 佇列的基本操作

1.順序佇列,可以實現以下功能 如下 include stdio.h define datetype int define maxsize 100 typedef struct seqqueue,pseqqueue 初始化佇列,入口引數 無,返回值 新的順序佇列指標,null表示失敗 pseqque...