實驗項目四 串基本操作的實現
課程名稱:數據結構
實驗項目名稱:串基本操作的實現
實驗目的:
1.掌握串的模式匹配操作。
實驗要求:
1、 分別使用BF和KMP算法完成串的模式匹配。
實驗過程:
1、 設計完成next值的計算函數;
2、 設計完成修正next值的函數;
3、 KMP算法代碼;
4、 輸入子串(abbc)和主串(abbabbcad)
5、 輸出子串在主串中開始的位置。
實驗報告中給出next,修正next,KMP及主函數的代碼。
實驗結果:
輸入: 子串:abbc; 主串:abbabbcad
輸出:4
實驗分析:
1.普通next和修正next的區別;
2.列舉調試運行過程中出現的錯誤並分析原因。
要求:
(1) 程序要添加適當的注釋,程序的書寫要采用縮進格式。
(2) 程序要具在一定的健壯性,即當輸入數據非法時,程序也能適當地做出反應。
(3) 程序要做到界面友好,在程序運行時用戶可以根據相應的提示信息進行操作。
(4) 上傳源程序到課堂派。順序表的源程序保存為Stringindex.cpp。
程序代碼:
// Test.cpp : Defines the entry point for the console application. // //#include "stdafx.h" #include <stdio.h> #include "stdlib.h" #include <iostream> using namespace std; //宏定義 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define MAXSTRLEN 100 typedef char SString[MAXSTRLEN + 1]; void GetNext(SString T, int next[]); int KMPindex(SString S, SString T, int pos); /************************************************************************/ /* 返回子串T在主串S中第pos位置之后的位置,若不存在,返回0 */ /************************************************************************/ int KMPindex(SString S, SString T, int pos) { if (pos <1 || pos > S[0] ) exit(ERROR); int i = pos, j =1; int next[MAXSTRLEN]; GetNext( T, next); while (i<= S[0] && j <= T[0]) { if (S[i] == T[j]) { ++i; ++j; } else { j = next[j]; } } if(j > T[0]) return i - T[0]; return ERROR; } /************************************************************************/ /* 求子串next[i]值的算法 */ /************************************************************************/ void GetNext(SString T, int next[]) { int j = 1, k = 0; next[1] = 0; while(j < T[0]){ if(k == 0 || T[j]==T[k]) { ++j; ++k; next[j] = k; } else { k = next[k]; } } } int main(){ SString S = {9,'a','b','b','a','b','b','c','a','d'}; SString T = {4,'a','b','b','c'}; int pos; pos = KMPindex( S, T, 1); cout<<"Pos:"<<pos; }
