数据结构:串( Bunch)及其实现

ops/2025/2/22 6:23:24/
什么是

(String)是由零个或多个字符组成的有限序列,比如 "hello" 就是一个是编程中非常常见的数据结构,常用于处理文本数据。

的特点:

  1. 顺序存储中的字符是连续存储的,类似于数组。

  2. 链式存储中的字符也可以通过链表的方式存储,每个节点存储一个字符。

  3. 常用操作:包括插入、删除、查找、替换等。


的存储方式

1. 顺序存储

顺序存储是用数组来存储中的字符。数组的每个元素存储一个字符,字符之间是连续存储的。

优点

  • 访问速度快,可以通过下标直接访问任意字符。

  • 实现简单。

缺点

  • 插入和删除操作需要移动大量字符,效率低。

  • 数组大小固定,不适合动态变化的

C 语言实现

#include <stdio.h>
#include <string.h>#define MAX_SIZE 100  // 的最大长度// 定义顺序存储的
typedef struct {char data[MAX_SIZE];  // 存储字符的数组int length;           // 的长度
} SeqString;// 初始化
void InitString(SeqString *s, const char *str) {strcpy(s->data, str);  // 复制字符到数组中s->length = strlen(str);  // 设置的长度
}// 插入字符
int InsertString(SeqString *s, int pos, const char *str) {if (pos < 0 || pos > s->length || s->length + strlen(str) > MAX_SIZE) {return -1;  // 插入位置不合法或空间不足}// 将插入位置后的字符往后移动for (int i = s->length - 1; i >= pos; i--) {s->data[i + strlen(str)] = s->data[i];}// 插入新字符for (int i = 0; i < strlen(str); i++) {s->data[pos + i] = str[i];}s->length += strlen(str);  // 更新的长度return 0;
}// 删除字符
int DeleteString(SeqString *s, int pos, int len) {if (pos < 0 || pos + len > s->length) {return -1;  // 删除位置不合法}// 将删除位置后的字符往前移动for (int i = pos + len; i < s->length; i++) {s->data[i - len] = s->data[i];}s->length -= len;  // 更新的长度return 0;
}// 查找子
int FindString(SeqString *s, const char *str) {for (int i = 0; i <= s->length - strlen(str); i++) {int j = 0;while (j < strlen(str) && s->data[i + j] == str[j]) {j++;}if (j == strlen(str)) {return i;  // 找到子,返回起始位置}}return -1;  // 未找到子
}// 打印
void PrintString(SeqString *s) {printf("内容:%s\n", s->data);
}int main() {SeqString s;InitString(&s, "hello");  // 初始化PrintString(&s);          // 打印InsertString(&s, 5, " world");  // 在位置 5 插入 " world"PrintString(&s);                // 打印DeleteString(&s, 5, 6);  // 从位置 5 删除 6 个字符PrintString(&s);         // 打印int index = FindString(&s, "llo");  // 查找子 "llo"if (index != -1) {printf("找到子,起始位置:%d\n", index);} else {printf("未找到子\n");}return 0;
}
2. 链式存储

链式存储是用链表来存储中的字符。每个节点存储一个字符,节点之间通过指针连接。

优点

  • 插入和删除操作效率高,不需要移动大量字符。

  • 适合动态变化的

缺点

  • 访问速度慢,需要从头开始遍历。

  • 内存开销大,每个节点需要额外存储指针。

C 语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义链式存储的节点
typedef struct Node {char data;           // 存储字符struct Node *next;   // 指向下一个节点的指针
} Node;// 定义链式存储的
typedef struct {Node *head;  // 头指针int length;  // 的长度
} LinkString;// 初始化
void InitString(LinkString *s, const char *str) {s->head = NULL;s->length = 0;// 从后往前插入字符,保证顺序正确for (int i = strlen(str) - 1; i >= 0; i--) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = str[i];newNode->next = s->head;s->head = newNode;s->length++;}
}// 插入字符
int InsertString(LinkString *s, int pos, const char *str) {if (pos < 0 || pos > s->length) {return -1;  // 插入位置不合法}// 找到插入位置的前一个节点Node *prev = NULL;Node *current = s->head;for (int i = 0; i < pos; i++) {prev = current;current = current->next;}// 插入新字符for (int i = 0; i < strlen(str); i++) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = str[i];newNode->next = current;if (prev == NULL) {s->head = newNode;  // 插入到头部} else {prev->next = newNode;}prev = newNode;s->length++;}return 0;
}// 删除字符
int DeleteString(LinkString *s, int pos, int len) {if (pos < 0 || pos + len > s->length) {return -1;  // 删除位置不合法}// 找到删除位置的前一个节点Node *prev = NULL;Node *current = s->head;for (int i = 0; i < pos; i++) {prev = current;current = current->next;}// 删除字符for (int i = 0; i < len; i++) {Node *temp = current;current = current->next;free(temp);s->length--;}if (prev == NULL) {s->head = current;  // 删除的是头节点} else {prev->next = current;}return 0;
}// 查找子
int FindString(LinkString *s, const char *str) {Node *current = s->head;int index = 0;while (current != NULL) {Node *temp = current;int i = 0;while (temp != NULL && i < strlen(str) {if (temp->data != str[i]) {break;}temp = temp->next;i++;}if (i == strlen(str)) {return index;  // 找到子,返回起始位置}current = current->next;index++;}return -1;  // 未找到子
}// 打印
void PrintString(LinkString *s) {Node *current = s->head;printf("内容:");while (current != NULL) {printf("%c", current->data);current = current->next;}printf("\n");
}int main() {LinkString s;InitString(&s, "hello");  // 初始化PrintString(&s);          // 打印InsertString(&s, 5, " world");  // 在位置 5 插入 " world"PrintString(&s);                // 打印DeleteString(&s, 5, 6);  // 从位置 5 删除 6 个字符PrintString(&s);         // 打印int index = FindString(&s, "llo");  // 查找子 "llo"if (index != -1) {printf("找到子,起始位置:%d\n", index);} else {printf("未找到子\n");}return 0;
}

的常用算法

1. 模式匹配算法

模式匹配是的一个重要操作,用于查找子在主中的位置。常见的算法有:

  • 算法>朴素算法:逐个字符比较,时间复杂度为 O(n*m)。

  • KMP 算法:通过预处理模式,减少比较次数,时间复杂度为 O(n+m)。


的使用场景

  1. 文本编辑器:用于处理文本的插入、删除、查找等操作。

  2. 搜索引擎:用于匹配关键词和网页内容。

  3. 编译器:用于解析源代码中的字符


应用实例:文本编辑器

文本编辑器可以用来实现:

  • 插入文本:在指定位置插入字符

  • 删除文本:删除指定位置的字符

  • 查找文本:查找指定的关键词。

  • 替换文本:将指定的字符替换为另一个字符


总结

是一种非常重要的数据结构,常用于处理文本数据。顺序存储和链式存储各有优缺点,适合不同的场景。通过学习的基本操作和常用算法,你可以更好地解决实际问题。希望通过这篇文章,你能轻松掌握的相关知识!


http://www.ppmy.cn/ops/160443.html

相关文章

自动化合约生成与管理:AI与Python的完美结合

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…

软件架构设计:信息系统基础

一、信息系统概述 定义 信息系统&#xff08;Information System, IS&#xff09;是由硬件、软件、数据、人员和流程组成的集合&#xff0c;用于收集、处理、存储和分发信息&#xff0c;支持组织的决策和运营。 组成要素 硬件&#xff1a;计算机、服务器、网络设备等。软件&am…

【Leetcode 每日一题】2209. 用地毯覆盖后的最少白色砖块

问题背景 给你一个下标从 0 0 0 开始的 二进制 字符串 f l o o r floor floor&#xff0c;它表示地板上砖块的颜色。 f l o o r [ i ] floor[i] floor[i] 为 ‘0’ 表示地板上第 i i i 块砖块的颜色是 黑色 。 f l o o r [ i ] floor[i] floor[i] 为’1’ 表示地板上第 i …

AI基础:数据可视化简易入门(Matplotlib和Seaborn)

Matplotlib是一个Python的2D绘图库&#xff0c;它以各种硬拷贝和跨平台的交互式环境生成出版质量级别的图形。 Seaborn是基于Python且非常受欢迎的图形可视化库&#xff0c;在Matplotlib的基础上进行了更高级别的封装&#xff0c;使作图更加方便快捷。 1 Matplotlib 1.1 通过…

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c;多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#x…

web安全:跨站请求伪造 (CSRF)

跨站请求伪造 (CSRF) ​ 跨站请求伪造&#xff08;CSRF&#xff0c;Cross-Site Request Forgery&#xff09; 是一种网络攻击方式&#xff0c;攻击者诱使受害者在未经其授权的情况下执行特定操作。CSRF 利用受害者已登录的身份和浏览器自动发送的认证信息&#xff08;如 Cooki…

TTL和CMOS的区别【数电速通】

CMOS电平&#xff1a;电压范围在3&#xff5e;15V&#xff1b;常见电压在12V。 TTL电平&#xff1a;电压范围在0&#xff5e;5V&#xff0c;常见都是5V CMOS的特点&#xff1a;电平由电源VDD​ 决定&#xff0c;而不是外部电源电平。 COMS电路的使用注意事项 我们在使用CMOS…

AI赋能传统系统:Spring AI Alibaba如何用大模型重构机票预订系统?

零、效果 一、启动项目 1.0、前置条件 Java 17Node.js 18获取 API key 具体文档&#xff1a;获取APP ID和Workspace ID_大模型服务平台百炼(Model Studio)-阿里云帮助中心 1.1、下载代码 Github地址&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-exa…