串——顺序存储结构

来源:互联网 发布:工程预结算软件 编辑:程序博客网 时间:2024/06/18 06:36

该文章主要介绍串的顺序存储结构以及相关运算。

头文件:SqString.h

#ifndef SQSTRING_H_#define SQSTRING_H_#include <iostream>const int MaxSize = 100;class SqStringClass//顺序串类{char *data;//存放串中元素int length;       //串中字符个数public://===================顺序串的基本运算算法=================SqStringClass();//构造函数~SqStringClass();//析构函数SqStringClass &operator=(char *cstr);//重载赋值运算符SqStringClass &operator=(SqStringClass &t);//重载赋值运算符int StrLength();//求串长度SqStringClass &operator+(SqStringClass &t);//串连接SqStringClass &SubStr(int i, int j);//求子串SqStringClass &InsStr(int i, SqStringClass &s);//串插入SqStringClass &DelStr(int i, int j);//串删除SqStringClass &RepStr(int i, int j, SqStringClass &s);//串替换void DispStr();//串输出//===================顺序串的其他运算算法===================friend bool StrEqueal(SqStringClass &s, SqStringClass &t);//比较两个串是否相等friend int Strcmp(SqStringClass &s, SqStringClass &t);//比较两个串的大小  <:-1 =:0 >:1//===================顺序串的串匹配运算算法================//以下为BF算法(暴力匹配)的友元函数声明friend int Index(SqStringClass &s, SqStringClass &t);//以下为KMPF算法的友元函数声明friend void GetNext(SqStringClass &t, int next[]);friend int KMPIndex(SqStringClass &s, SqStringClass &t);};#endif

源文件:SqString.cpp

#include "SqString.h"using namespace std;//=====================顺序串的基本运算算法===================SqStringClass::SqStringClass()//构造函数{data = new char[MaxSize];length = 0;}SqStringClass::~SqStringClass()//析构函数{delete[] data;}SqStringClass &SqStringClass::operator=(char *cstr)//重载赋值运算符{int i;for (i = 0; cstr[i] != '\0'; i++)data[i] = cstr[i];length = i;return *this;}SqStringClass &SqStringClass::operator=(SqStringClass &t)//重载赋值运算符{int i;for (i = 0; i<t.length; i++)data[i] = t.data[i];length = t.length;return *this;}int SqStringClass::StrLength()//求串长度{return length;}SqStringClass &SqStringClass::operator+(SqStringClass &t) //串连接{static SqStringClass nstr;int i;nstr.length = length + t.length;for (i = 0; i<length; i++)nstr.data[i] = data[i];for (i = 0; i<t.length; i++)nstr.data[length + i] = t.data[i];return nstr;}SqStringClass &SqStringClass::SubStr(int i, int j)//求子串{static SqStringClass nstr;int k;if (i <= 0 || i>length || j<0 || i + j - 1>length)return nstr;for (k = i - 1; k<i + j - 1; k++)nstr.data[k - i + 1] = data[k];nstr.length = j;return nstr;}SqStringClass &SqStringClass::InsStr(int i, SqStringClass &s){int j;static SqStringClass nstr;if (i <= 0 || i>length + 1)return nstr;for (j = 0; j<i - 1; j++)nstr.data[j] = data[j];for (j = 0; j<s.length; j++)nstr.data[i + j - 1] = s.data[j];for (j = i - 1; j<length; j++)nstr.data[s.length + j] = data[j];nstr.length = length + s.length;return nstr;}SqStringClass &SqStringClass::DelStr(int i, int j)//串删除{int k;static SqStringClass nstr;if (i <= 0 || i>length || i + j - 1>length)return nstr;for (k = 0; k<i - 1; k++)nstr.data[k] = data[k];for (k = i + j - 1; k<length; k++)nstr.data[k - j] = data[k];nstr.length = length - j;return nstr;}SqStringClass &SqStringClass::RepStr(int i, int j, SqStringClass &s)//串替换{int k;static SqStringClass nstr;if (i <= 0 || i>length || i + j - 1>length)return nstr;for (k = 0; k<i - 1; k++)nstr.data[k] = data[k];for (k = 0; k<s.length; k++)nstr.data[i + k - 1] = s.data[k];for (k = i + j - 1; k<length; k++)nstr.data[s.length + k - j] = data[k];nstr.length = length - j + s.length;return nstr;}void SqStringClass::DispStr()//串输出{int i;for (i = 0; i<length; i++)cout << data[i];cout << endl;}//=====================顺序串的其他运算算法=======================bool StrEqueal(SqStringClass &s, SqStringClass &t){int len1 = s.StrLength();int len2 = t.StrLength();if (len1 != len2)return false;for (int i = 0; i < len1; i++){if (s.data[i] != t.data[i])return false;}return true;}int Strcmp(SqStringClass &s, SqStringClass &t){int len1 = s.StrLength();int len2 = t.StrLength();int len = len1 < len2 ? len1 : len2;for (int i = 0; i < len; i++){if (s.data[i] < t.data[i])return -1;if (s.data[i] > t.data[i])return 1;}if (len1 < len2)return -1;else if (len1 > len2)return 1;elsereturn 0;}//=========================顺序串的串匹配(BF)运算算法======================int Index(SqStringClass &s, SqStringClass &t){int i = 0, j = 0;while (i < s.StrLength() && j < t.StrLength()){if (s.data[i] == t.data[j]){i++;j++;}else{i = i - j + 1;j = 0;}}if (j >= t.StrLength()) return i - t.StrLength();elsereturn -1;}//==========================顺序串的串匹配(KMPF)运算算法====================void GetNext(SqStringClass &t, int next[]){int j=0;int k = -1;next[0] = -1;while (j < t.length-1){if (k==-1||t.data[j] == t.data[k]){k++;j++;next[j] = k;}else{k = next[k];}}}int KMPIndex(SqStringClass &s, SqStringClass &t){int *next = new int[t.StrLength()];GetNext(t, next);int i = 0;int j = 0;int len1 = s.length;int len2 = t.length;while (i < len1&&j < len2){if (j==-1||s.data[i] == t.data[j]){i++;j++;}else{j = next[j];}}delete[]next;if (j >= len2) return i - t.length;elsereturn -1;}

主函数:main.cpp

#include "SqString.h"using namespace std;//===================顺序串的基本运算算法=====================void main1(){SqStringClass s1,s2,s3,s4,s5,s6,s7;s1="abcd";cout << "s1:"; s1.DispStr();cout << "s1的长度:" << s1.StrLength() << endl;cout << "s1=>s2\n";//===s2=s1;cout << "s2:"; s2.DispStr();//===s3="12345678";cout << "s3:"; s3.DispStr();cout << "s1和s3连接=>s4\n";s4=s1+s3;cout << "s4:"; s4.DispStr();//===cout << "s3[2..5]=>s5\n";s5=s3.SubStr(2,4);cout << "s5:"; s5.DispStr();//===cout << "从s3中删除s3[3..6]字符=>s6\n";s6=s3.DelStr(3,4);cout << "s6:"; s6.DispStr();//===cout << "将s4[2..4]替换成s1=>s7\n";s7=s4.RepStr(2,3,s1);cout << "s7:"; s7.DispStr();//===cout << "main函数结束,销毁所有的串对象" << endl;}//-=================顺序串的其他运算算法================void main2(){SqStringClass s1, s2, s3, s4;s1 = "abcd";s2 = "abcd";s3 = "fhgt";s4 = "fhg";//===bool flag1 = StrEqueal(s1, s2);if (flag1)cout << "s1和s2相等" << endl;elsecout << "s1和s2不等" << endl;//===int compare = Strcmp(s3, s4);if (compare < 0)cout << "s3小于s4!" << endl;else if (compare>0)cout << "s3大于s4!" << endl;elsecout << "s1等于s2!" << endl;}//====================顺序串的串匹配(BF)运算算法=============void main3(){SqStringClass s1, s2;s1 = "efabcd";s2 = "cdh";int index = Index(s1, s2);if (index!=-1)cout << "s2从"<<index<<"处开始和s1匹配!" << endl;elsecout << "s1中不存在子串s2!" << endl;//}//===================顺序串的串匹配(KMP)运算算法===========void main(){SqStringClass s, t;s = "myseuabcac";t = "abcac";int index = KMPIndex(s, t);cout << index << endl;}



原创粉丝点击