1. 程式人生 > >串的比較與模式匹配(BF演算法)

串的比較與模式匹配(BF演算法)

串的比較

//標頭.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;
}