串:即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。
若干术语:
- 串长:串中字符个数(n>=0),n=0时为空串;
- 空白串:由一个或多个空格符组成的串;
- 字符位置:字符在串中的序号;
- 串相等:串的长度和对应位置上的字符都相等;
- 子串:串中任意个连续的字符组成的子序列;
- 主串:包含子串的串;
- 子串的位置:子串的第一个字符在主串中的序号。
串的最小操作子集: - 串赋值:Str_Assign
- 串比较:Str_Compare
- 求串长:Str_Length
- 串连接:Str_Concat
- 求子串:Str_Substring
具体实现代码:
//C++头文件与宏定义
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define MAXSIZE 255
//为串赋值
void Str_Assign(SString &S,char chars[]){
int Slength = 0; //用int型变量Slength记录串的长度
int i = 0,j = 1,k = 0;
while (chars[i] != '\0') //计算待赋值串的长度
{
Slength++;
i++;
}
if(Slength == 0){
S[0] = 0; //待赋值串的长度为0,串的长度也为0
}
else{
if(Slength > MAXSIZE){ //待赋值串的长度大于最大定长,发生截断
while(j <= MAXSIZE){
S[j++] = chars[k++]; //串元素下标从1开始计
}
S[0] = MAXSIZE;
cout<<"为串赋值成功!" << endl;
cout << "待赋值串的长度" << Slength <<"大于定长顺序串的最大长度" << MAXSIZE <<"发生截断!" << endl;
}
else{
while(j <= Slength){ //待赋值串的长度小于等于最大定长,不会发生截断
S[j++] = chars[k++];
}
S[0] = Slength;
cout << "为串赋值成功!" << endl;
}
}
}
//清空串
void Str_Clear(SString &S){
if(Str_Length(S) == 0){
cout << "当前串为空,无需清空!" << endl;
}
else{
S[0] = 0;
cout << "串清空完成!" << endl;
}
}
//得到顺序串的长度
int Str_Length(SString &S){
return S[0];
}
//两个顺序串的大小比较
int Str_Compare(SString &S, SString &T){
for(int i = 1;(i <= S[0]) && (i <= T[0]);i++){
if(S[i] != T[i]){
return S[i] - T[i];
}
else
return S[0] - T[0];
}
}
//连接两个顺序串
void Str_Concat(SString &T, SString &S1, SString &S2){
T[0] = 0; //T为空串,用于记录两个串的连接结果
if(S1[0] + S1[0] <= MAXSIZE){
//两个串总元素个数和不超过最大定长,不发生截断,此时T长度为两个串的总长度
for(int i = 1;i <= S1[0];i++){
T[i] = S1[i];
}
for(int i = S1[0] + 1,j = 1;j <= S2[0];i++,j++){
T[i] = S2[j];
}
T[0] = S1[0] + S2[0];
cout << "未发生截断,连接成功!" << endl;
}
else if((S1[0] < MAXSIZE) && (S1[0] + S2[0] > MAXSIZE)){
//S1长度小于最大定长,但S1和S2总长度大于最大定长,连接时会发生截断,此时T长度为最大定长
for(int i = 1;i <= S1[0];i++){
T[i] = S1[i];
}
for(int i = S1[0],j = 0;i <= MAXSIZE;i++,j++){
T[i] = S2[j];
}
T[0] = MAXSIZE;
cout << "S2发生截断,未连接成功!" << endl;
}
else if(S1[0] == MAXSIZE){
//S1的长度就是最大定长,S2连接不上,此时T长度同S1为最大定长
for(int i = 1;i <= MAXSIZE;i++){
T[i] = S1[i];
}
T[0] = S1[0] = MAXSIZE;
cout << "S2未连接上,未连接成功!" << endl;
}
}
//得到子串
/*用Sub返回串s中第pos个字符起长度为len的子串*/
void Str_Substring(SString &Sub, SString &S, int pos, int len){
if ((pos < 1) || (pos > S[0]) || (len < 0) || (len > (S[0] - pos + 1)))
cout << "参数输入错误,请再次输入!";
for (int i = 1; i <= len; i++){
Sub[i] = S[pos + i - 1];
}
Sub[0] = len;
}
//插入,在串S的第pos个字符之前插入串T
void Str_Insert(SString &S, SString &T, int pos){
if ((S[0] + T[0]) <= MAXSIZE)
{
int j = 0;
for (int i = (S[0]+T[0]); i >= pos; i--) //将主串从后往前移动,腾出子串的位置
{
S[i] = S[S[0] - j];
j++;
}
j = 1;
for (int i = pos; i < (pos + T[0]); i++) //将子串插入到pos位置起的部分
{
S[i] = T[j];
j++;
}
S[0] = S[0] + T[0];
cout << "在串S的第" << pos << "个字符之前插入串T成功!" ;
}
}
//删除,从串S中删除第pos个字符起长度为len的子串
void Str_Delete(SString &S, int pos,int len){
for (int i = pos; i < (S[0] - pos + 1); i++){
S[i] = S[i+len];
}
S[0] = S[0] - len;
}
//串的输出
void Str_Output(SString &S){
int i = 1;
while(i <= S[0]){ //通过下标依次输出串中的元素
cout << S[i] <<" ";
i++;
}
}
运行截图: