(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...