串的比較與模式匹配(BF演算法)
阿新 • • 發佈:2018-12-20
串的比較
//標頭.h
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
typedef int Status;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define STRING_INIT_SIZE 100
#define STRINGINCREMENT 10
typedef struct
{
char * ch;
int length;
int listsize;
}Hstring;
Status InitString (Hstring &S)
{ //建立連結串列
S.ch = (char *)malloc(STRING_INIT_SIZE * sizeof(char));
if (!S.ch)exit(OVERFLOW);
S.length = 0;
S.listsize = STRING_INIT_SIZE;
return OK;
}//InitString
Status GetString(Hstring &S)
{ //輸入字串
char c;
int i = 0;
c = getchar();
while (c!='\n') {
S.ch[i]=c;
S.length++ ;
c = getchar();
i++;
}
return OK;
}//GetString
Status CompareString(Hstring &S, Hstring &T)
{ //比較串S,T
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;
}//CompareString
int DestoryString(Hstring & S)
{ //銷燬
free(S.ch);
return OK;
}//DestoryString
//源.cpp
#include"標頭.h"
int main()
{
Hstring S;
Hstring T;
if (InitString(S) == OK && InitString(T) == OK)
cout << "連結串列建立成功!" << endl;
else
{
cout << "建立失敗!退出..." << endl;
return 0;
}
cout << "輸入字串S:" << endl;
GetString(S);
cout << "輸入字串T:" << endl;
GetString(T);
if (CompareString(S, T) > 0)
cout << "字串S > 字串T!" << endl;
else if (CompareString(S, T) == 0)
cout << "字串S = 字串T!" << endl;
else
cout << "字串S < 字串T!" << endl;
DestoryString(S);
DestoryString(T);
return 0;
}//(1)程式設計實現兩個串S和T的比較。
模式匹配(FB演算法)
//標頭.h
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
typedef int Status;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define STRING_INIT_SIZE 100
#define STRINGINCREMENT 10
typedef struct
{
char * ch;
int length;
int listsize;
}Hstring;
Status InitString(Hstring &S)
{ //建立連結串列
S.ch = (char *)malloc(STRING_INIT_SIZE * sizeof(char));
if (!S.ch)exit(OVERFLOW);
S.length = 0;
S.listsize = STRING_INIT_SIZE;
return OK;
}//InitString
Status GetString(Hstring &S)
{ //輸入字串
if (S.length == S.listsize)
S.ch = (char*)realloc(S.ch ,(STRINGINCREMENT+S.listsize) * sizeof(char));
char c;
int i = 0;
c = getchar();
while (c != '\n') {
S.ch[i] = c;
S.length++;
c = getchar();
i++;
}
return OK;
}//GetString
void PutString(Hstring S)
{ //輸出
int i = 0;
while (i<S.length)
{
cout << S.ch[i];
i++;
}
cout << endl;
}
Status CompareString(Hstring &S, Hstring &T)
{ //比較串S,T
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;
}//CompareString
int DestoryString(Hstring &S)
{ //銷燬
free(S.ch);
return OK;
}//DestoryString
Status IndexString(Hstring S, Hstring T, int pos)
{ //模式匹配
int i=0,j=pos-1;
while (j < S.length&&i < T.length)
{
if (S.ch[j] == T.ch[i])
{
j++;
i++;
}
else
{
j = j - i + 1;
i = 0;
}
}
if (j > pos)return j -i-pos;
else return ERROR;
}//IndexString
//源.cpp
#include"標頭.h"
int main()
{
Hstring S,T;
int pos;
if (InitString(S) == OK && InitString(T) == OK)cout << "建立成功!" << endl;
else { cout << "建立失敗!退出..." << endl; return 0; }
cout << "輸入主字串S:" << endl;
GetString(S);
cout << "輸入匹配子串T:" << endl;
GetString(T);
cout << "輸入起始匹配位置:" << endl;
cin >> pos;
if (IndexString(S, T, pos) == ERROR)cout << "主串S中沒有子串T!!!" << endl;
else cout << "子串在主串的位置與起始匹配的位置間隔為:"<< IndexString(S,T,pos)<<endl;
return 0;
}