字符串的实现可以用数组也可以用链表。这里只讨论数组存储表示。

#实现

数组空间放满时,重新分配空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdlib.h>
void overflowProcess() {
char *newAddress = new char[2 * maxSize];
if (newAddress == NULL) {
cerr << "Memory Allocation Error" << endl;
exit(1);
}
int n = maxSize = 2 * maxSize;
char *srcptr = ch;
char *destptr = newAddress;
while (n --) {
*destptr ++ = *srcptr ++;
}
delete []ch;
ch = newAddress;
}

串构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
AString::AString(int sz) {
maxSize = n;
ch = new char[maxSize + 1];
if (ch == NULL) {
cerr << "Allocation Error" << endl;
exit(1);
}
curLength = 0;
ch[0] = '\0';
};
AString::AString(const char *init) {
int len = strlen(init);
maxSize = (len > defaultSize) ? len : defaultSize;
ch = new char[maxSize + 1];
if (ch == NULL) {
cerr << "Allocation Error" << endl;
exit(1);
}
curLength = len;
strcpy(ch, init);
};

串复制构造函数。

1
2
3
4
5
6
7
8
9
10
AString::AString(const AString& ob) {
maxSize = ob.maxSize;
ch = new char[maxSize + 1];
if (ch == NULL) {
cerr << "Allocation Error" << endl;
exit(1);
}
curLength = ob.curLength;
strcpy(ch. ob.ch);
};

求子串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AString AString::operator () (int pos, int len) {
AString temp;
if (pos < 0 || pos + len - 1 >= maxSize || len < 0) {
temp.curLength = 0;
temp.ch[0] = '\0';
} else {
if (pos + len - 1 >= curLength) {
len = curLength - pos;
}
temp.curLength = len;
for (int i = 0, j = pos; i < len; i ++, j ++) {
temp.ch[i] = ch[j];
}
temp.ch[len] = '\0';
}
return temp;
};

串赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AString& AString::operator = (const AString& ob) {
if (&ob != this) {
delete []ch;
ch = new char[maxSize + 1];
if (ch == NULL) {
cerr << "Allocation Error" << endl;
exit(1);
}
curLength = ob.curLength;
strcpy(ch, ob.ch);
} else {
cout << "String Assign Error" << endl;
}
return this;
}

串连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AString& AString::operator += (const AString& ob) {
char *temp = ch;
int n = curLength + ob.curLength;
int m = (maxSize >= n) ? maxSize : n;
ch = new char[m];
if (ch == NULL) {
cerr << "Allocation Error" << endl;
exit(1);
}
maxSize = m;
curLength = m;
strcpy(ch, temp);
strcat(ch, ob.ch);
delete []temp;
return this;
}

#模式匹配

##B-F算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int AString::Find(AString& pat, int k) const {
int i, j;
for (i = k; i <= curLength - pat.curLength; i ++) {
for (j = 0; j < pat.curLength; j ++) {
if (ch[i + j] != pat.ch[j]) {
break;
}
}
if (j == pat.curLength) {
return i;
}
}
return -1;
};

##KMP算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int AString::fastFind(AString& pat, int k, int next[]) const {
int posP = 0, posT = k;
int lengthP = pat.curLength;
int lengthT = curLength;
while (posP < lengthP && posT < lengthT) {
if (posP == -1 || pat.ch[posP] == ch[posT]) {
posP ++;
posT ++;
} else {
posP = next[posP];
}
}
if (posP < lengthP) {
return -1;
} else {
return posT - lengthP;
}
};
void AString::getNext(int next[]) {
int j = 0, k = -1, lengthP = curLength;
next[0] = -1;
while (j < lengthP) {
if (k == -1 || ch[j] == ch[k]) {
j ++;
k ++;
next[j] = k;
} else {
k = next[k];
}
}
};