資料結構實驗四 串的模式匹配BF KMP

2022-09-19 18:54:12 字數 2407 閱讀 4680

#include

#include "stdio.h"

#include "stdlib.h"

#include "cstdlib"//syste()函式需要該標頭檔案;

using namespace std;

#define ok 1

#define error 0

//#define overflow -2

typedef int status;

typedef char selemtype;

#define maxlen 255 // 使用者可在255以內定義最大串長,超出這個長度則超出部分被捨去,稱為截斷

//00 _棧:typedef char sstring[maxlen+2];//0不用,最後乙個\0

//00 _堆:串的堆順序儲存,動態分配,結構無資料域,需建立或初始化中開闢空間

typedef struct hstring;//heap堆,故hstring,sstring?

//01初始化串 p5801...maxlen\0,多兩個空間不放字元

status inithstring(hstring&s)

//02建立串,從鍵盤錄入<=maxlen

status createhstring(hstring&s)

else

break;

}s.ch[i] = '\0';

s.length = i-1;

return ok;

}//03 bf演算法

int index_bf(hstring s, hstring t) //返回模式串t在主串s中第一次出現的位置。因返回的是位置,不是狀態,雖都是int,但不用status,另說清誰是模式串,誰是主串。

else //看上面例子,不管那一輪只要失敗,那麼有i回溯到初值的下一位; j 始終是第1個和si,即j=1;

}//迴圈完也只有兩種情形,要麼匹配,要麼失敗,換成計算機語言仍就是if else;

cout << "bf一共比較了" << sum << "次" << endl;

if (j>t.length)

return (i - t.length); //返回位置. 比較成功的次數是t.length, i從初值也後移了t.length,i-t.length回到初值

else

return 0;

}//04 next函式

void get_next(hstring t, int next)//求模式串t的next函式值,其實是知next[1],求next[2],依次……,也即假設已知next[j], ++j後求得next[j]即未我所求;

else//匹配失敗的情況,就要進行回溯,下一輪tj與tk'比較,j不動,k'=next[k];

k = next[k];}}

//05 nextval函式

void get_nextval(hstring t, int nextval)//求模式串t的nextval函式值,在next函式的基礎上只需改動tj=tk相等時的情形,讓nextval[j]=nextval[k]而不是k ;

else//匹配失敗的情況,就要進行回溯,下一輪tj與tk'比較,j不動,k'=next[k];

k = nextval[k];}}

//06 kmp,到底是next還是nextval,看主函式呼叫該子函式傳的引數是哪乙個

int index_kmp(hstring s, hstring t, int next)//利用非空模式串t的next函式求t在主串s中的位置的kmp演算法,形式上近同bf演算法

else

j = next[j]; // 利用next函式確定下一次模式串中第j個字元與t.ch[i]比較,i不變

}cout << "kmp一共比較了" << sum << "次" << endl;

if (j>t.length) // 匹配成功

return i - t.length;

else

return 0;

}//07輸出串

void printstr(hstring str)//輸出串

printf("\n");

}//08列印next值,主函式呼叫該函式,傳的引數是next,則列印next[j],傳nextval,則列印nextval[j], 該子函式中的next只是乙個形參,可以起別的名

void printnext(int next)

printf("\n");

}void main()

while (ch == 'y' || ch == 'y');

*/

system("pause");

}

資料結構實驗四 串(模式匹配,刪除子串)

實驗三串 一 實驗目的 1 熟悉串的順序儲存結構 2 掌握串的基本運算及應用 二 實驗內容 1 模式匹配 串採用順序儲存結構,編寫樸素模式匹配演算法,查詢在串中是否存在給定的子串。本標頭檔案為實驗四第一問串的順序儲存 include using namespace std const int siz...

資料結構實驗四 串

一 實驗目的 通過訓練,加深理解並把握串的基本運算的特點。二 實驗內容 問題描述 本題目中的串編輯要求對串實現以下兩種功能 本題目中的串編輯要求對串實現以下兩種功能 插入 把乙個字串插入到給定串的指定位置 刪除 將串中某指定位置開始的若干字元從串中刪除 參考程式 include include in...

資料結構(四) 串

串 string 是由零個或多個字元構成的有限序列,又叫字串 空格串 只包含空格的串 空串 零個字元的串 串的大小比較 對於數字來說,1與2 誰大誰小不用討論,但是 兩個字串怎麼比較大小呢?計算機的常用字元是使用標準的ascii編碼。所以我們字串的比較就是逐個的比較ascii值的大小 串的一些操作函...