数据结构——详解字符串

目录

 

一、串的基本概念

二、串的基本操作 

三、串的实现 

1、串的定义

2、串的初始化

3、从字符常量拷贝

4、串比较

5、串联接 

6、模式匹配

7、求串长

四、完整代码 

五、小结 

六、参考文献 

 


 

一、串的基本概念

1、串的定义:串,也被称为字符串,是由零个或多个字符组成的有限序列。串中字符的个数称为串的长度。串的基本概念包括子串、主串、空格串、空串和相等的串等。

相关术语:

  • 子串:串中任意连续的字符组成的子序列称为该串的子串。
  • 主串:包含子串的串为该子串的主串。
  • 空格串:由一个或多个连续空格组成的串称为空格串。
  • 空串:长度为零的字符串称为空串。
  • 相等的串:只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等

2、串的特点 

优点:

  • 串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的,这种存储方式构建简单,能在O(1)的时间里根据数组的下标(index)查询某个元素。

缺点:

  • 串的操作相较于线性表来说较为复杂,因为串的数据元素是按照一定的顺序排列的,因此在进行插入、删除等操作时,需要移动大量的数据元素,这会导致效率较低。
  • 同时由于串的数据元素是相同类型的,因此在存储时会浪费一定的空间。

二、串的基本操作 

1、初始化:设置串的最大值,并初始化串的长度为零

2、复制串:复制串的操作是将一个已有的串复制到另一个串中

3、比较串:比较串的操作是比较两个已存在的串是否相等

4、连接串:连接串的操作是将两个已有的串连接在一起形成一个新的串

5、模式匹配:串的模式匹配,也被称为子串的定位操作,是在主串中查找是否存在与模式串相等的子串的过程

6、求串长:输出串的长度

三、串的实现 

1、串的定义

定义一个名为sstring结构体,里面包含一个字符指针data,最大容量max,字符长度冷


typedef struct
{
	char* data;
	int max;
	int len;
}sstring;

2、串的初始化

使用malloc函数为S->data分配内存空间,大小为sizeof(char)*max如果内存分配成功,将max赋值给S->max,表示字符串的最大长度。将S->len设置为0,表示字符串的当前长度。

int init(sstring *S, int max)
{
    //使用malloc函数为S->data分配内存空间,大小为sizeof(char)*max
	S->data = (char*)malloc(sizeof(char)*max);

	if(!S->data)
	{
		printf("申请内存失败!1000");
		return 1000;
	}
	S->max = max;
	S->len = 0;
	return 0;
}

3、从字符常量拷贝

首先计算from字符串的长度,检查长度是否超过了S字符串的最大长度未超过函数会使用一个for循环将from字符串的每个字符复制到S字符串中。最后,函数会在S字符串的末尾添加一个空字符('\0')表示字符串的结束,并将S字符串的长度设置为from字符串的长度。

/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from)
{
	int i;
	int len = strlen(from);

	if(len>S->max)
	{
		printf("超出了字符串S的长度!1001\n");
		return 1001;
	}
	for(i=0;idata[i] = from[i];
	}
	S->data[i] = '\0';
	S->len = len;
	return 0;
}

4、串比较

首先,比较两个字符串是否相等,如果s1的长度小于s2的长度,则返回-1;如果s1的长度大于s2的长度,则返回1。如果长度相等,则继续进行字符比较。使用一个循环遍历两个字符串的每个字符。如果在相同位置上的字符不相等,则返回-2。如果所有字符都相等,则说明两个字符串相等,函数返回0。

/*串比较*/
int str_compare(const sstring* s1, const sstring* s2)
{
    int i;
    int result;

    // 比较两个字符串的长度
    if (s1->len < s2->len) {
        return -1;
    } else if (s1->len > s2->len) {
        return 1;
    }

    // 长度相等,比较每个字符
    for (i = 0; i < s1->len; i++) {
        if (s1->data[i] != s2->data[i]) {
            return -2;
        } 
    }

    // 字符串相等
    return 0;
}

5、串联接 

首先检查s1的长度加上s2的长度是否超过了s1的最大长度。如果超过了,就使用realloc函数重新分配内存,将s1的数据指针指向新的内存空间,并更新s1的最大长度为s1的长度加上s2的长度加一。然后,使用strcat函数将s2的数据追加到s1的数据后面。最后,更新s1的长度为原来的长度加上s2的长度。

/*串联接*/
void str_strcat(sstring* s1, sstring* s2) {
    if (s1->len + s2->len > s1->max) {
        s1->data = (char*)realloc(s1->data, (s1->len + s2->len + 1) * sizeof(char));
        s1->max = s1->len + s2->len + 1;
    }
    strcat(s1->data + s1->len, s2->data);
    s1->len += s2->len;
}

6、模式匹配

字符串的模式匹配通过使用一个while循环逐个比较主串和模式串的字符,直到找到一个不匹配的字符或者比较完所有字符

/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub)
{
	int i, j, k;
	int m = S->len;
	int n = sub->len;

	for(i=0;i<=m-n;i++)
	{
		j=0;
		k=i;
		while(jdata[k] == sub->data[j])
		{
			j++;
			k++;
		}
		if(j==n)
		{
			return i+1;
		}
	}
	return -1;
}

7、求串长

*求串长*/
int sstrlen(sstring* str) {
    return str->len;
}

四、完整代码 

1、main.c

#include 
#include "sstring.h"
#include "welcome.h"





int main(int argc, char* argv[])
{
	sstring S;
	sstring sub;
	int i,m,n;


	int max;
	int index;
	int cmd;
	char str1[100];
	char str2[100];
	int result;
	for(i=0;i=0)
			{
				printf("匹配成功,子串在主串的【%d】位置\n",index); 
			}
			else
			{
				printf("子串不在主串中!\n");
			}
			break;
		
		case 7:
			printf("主串的长度为【%d】\n",sstrlen(&S));
			printf("子串的长度为【%d】\n",sstrlen(&sub));
			break;
		
		case 8:
			printf("本程序由zzb设计开发,实现了串的复制、比较、联接、模式匹配等操作\n");
			break;
			
		}

	}while(cmd!=0);


	return 0;
}


 2、sstring.c

/*
	sstring.c

*/
#include "sstring.h"


/*初始化串*/
int init(sstring *S, int max)
{
	//使用malloc函数为S->data分配内存空间,大小为sizeof(char)*max
	S->data = (char*)malloc(sizeof(char)*max);

	if(!S->data)
	{
		printf("申请内存失败!1000");
		return 1000;
	}
	S->max = max;
	S->len = 0;
	return 0;
}


/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from)
{
	int i;
	int len = strlen(from);

	if(len>S->max)
	{
		printf("超出了字符串S的长度!1001\n");
		return 1001;
	}
	for(i=0;idata[i] = from[i];
	}
	S->data[i] = '\0';
	S->len = len;
	return 0;
}


/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub)
{
	int i, j, k;
	int m = S->len;
	int n = sub->len;

	for(i=0;i<=m-n;i++)
	{
		j=0;
		k=i;
		while(jdata[k] == sub->data[j])
		{
			j++;
			k++;
		}
		if(j==n)
		{
			return i+1;
		}
	}
	return -1;
}
/*串比较*/
int str_compare(const sstring* s1, const sstring* s2)
{
    int i;
    int result;

    // 比较两个字符串的长度
    if (s1->len < s2->len) {
        return -1;
    } else if (s1->len > s2->len) {
        return 1;
    }

    // 长度相等,比较每个字符
    for (i = 0; i < s1->len; i++) {
        if (s1->data[i] != s2->data[i]) {
            return -2;
        } 
    }

    // 字符串相等
    return 0;
}


/*串联接*/
void str_strcat(sstring* s1, sstring* s2) {
    if (s1->len + s2->len > s1->max) {
        s1->data = (char*)realloc(s1->data, (s1->len + s2->len + 1) * sizeof(char));
        s1->max = s1->len + s2->len + 1;
    }
    strcat(s1->data + s1->len, s2->data);
    s1->len += s2->len;
}

/*求串长*/
int sstrlen(sstring* str) {
    return str->len;
}


3、 sstring.h

/*
	sstring.h
	顺序字符串
*/

typedef struct
{
	char* data;
	int max;
	int len;
}sstring;

/*初始化串*/
int init(sstring *S, int max);
/*从字符常量拷贝*/
int sstrcpy(sstring *S, char* from);
/*模式匹配*/
int sstrmatch(sstring *S, sstring *sub);
/*串比较*/
int str_compare(const char* s1, const char* s2);
/*串联接*/
void str_strcat(char *s1, const char *s2);
/*求串长*/
int sstrlen(sstring* str);

4、welcome.h 

char welcome[] =(
    "                ********\n"
    "               ************\n"
    "               ####....#.\n"
    "             #..###.....##....\n"
    "             ###.......######              ###            ###\n"
    "                ...........               #...#          #...#\n"
    "               ##*#######                 #.#.#          #.#.#\n"
    "            ####*******######             #.#.#          #.#.#\n"
    "           ...#***.****.*###....          #...#          #...#\n"
    "           ....**********##.....           ###            ###\n"
    "           ....****    *****....\n"
    "             ####        ####\n"
    "           ######        ######\n"
    "##############################################################\n"
    "#...#......#.##...#......#.##...#......#.##------------------#\n"
    "###########################################------------------#\n"
    "#..#....#....##..#....#....##..#....#....#####################\n"
    "##########################################    #----------#\n"
    "#.....#......##.....#......##.....#......#    #----------#\n"
    "##########################################    #----------#\n"
    "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n"
    "##########################################    ############\n\n"
    );

5、运行截图 

数据结构——详解字符串_第1张图片

 

五、小结 

字符串是由零个或多个字符组成的有限序列,字符串的基本操作包括:初始化、求长度、连接、比较、复制,模式匹配等操作。同时串的操作相较于线性表来说较为复杂,因为串的数据元素是按照一定的顺序排列的,因此在进行插入、删除等操作时,需要移动大量的数据元素,这会导致效率较低。字符串是计算机领域中一个非常重要的数据类型,其相关操作和算法在编程中有着广泛的应用。

六、参考文献 

《数据结构》(C语言版)李刚,刘万辉.北京:高等教育出版社 ,2017.   

《C语言程序设计》(第四版)谭浩强. 北京:清华大学出版社,2014.

  CSDN 数据结构-----字符串

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构,算法)