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

embedded/2025/2/27 4:59:01/
什么是

(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/embedded/167447.html

相关文章

【服务器与本地互传文件】远端服务器的Linux系统 和 本地Windows系统 互传文件

rz 命令&#xff1a;本地上传到远端 rz 命令&#xff1a;用于从本地主机上传文件到远程服务器 rz 是一个用于在 Linux 系统中通过 串口 或 SSH 上传文件的命令&#xff0c;它实际上是 lrzsz 工具包中的一个命令。rz 命令可以调用一个图形化的上传窗口&#xff0c;方便用户从本…

大数据领域主要岗位的技术能力要求明细

以下是针对大数据领域主要岗位的技术能力要求明细&#xff0c;按岗位分类整理&#xff1a; 1. 大数据工程师 核心技术栈&#xff1a; 分布式计算框架&#xff1a;Hadoop&#xff08;HDFS、MapReduce、YARN&#xff09;、Spark&#xff08;Spark Core、Spark SQL、Spark Streami…

AI绘画软件Stable Diffusion详解教程(2):Windows系统本地化部署操作方法(专业版)

一、事前准备 1、一台配置不错的电脑&#xff0c;英伟达显卡&#xff0c;20系列起步&#xff0c;建议显存6G起步&#xff0c;安装win10或以上版本&#xff0c;我的显卡是40系列&#xff0c;16G显存&#xff0c;所以跑大部分的模型都比较快&#xff1b; 2、科学上网&#xff0…

表单制作代码,登录动画背景前端模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS来实现一个“表单制作代码,登录动画背景前端模板”。该素材呈现了数据符号排版显示出人形的动画效果,新颖有…

Hi3516CV610开发板ISP调试之——图像ISP在线调试 环境搭建教程

本文讲解Hi3516CV610开发板如何实时在线调试图像ISP参数 首先烧录好资料包中的出厂固件&#xff08;默认出厂已烧录好&#xff09;&#xff0c;接好网线、usb转串口线、电源&#xff0c;进入开发板系统 打开odm查看实时视频 解压打开资料包中的PQTools_V1.x.xx.zip并找到PQTool…

全市场大模型分类及对比分析报告

全市场大模型分类及对比分析报告 1. 引言 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Models&#xff09;已成为推动AI进步的核心力量。大模型凭借其强大的计算能力和海量数据处理能力&#xff0c;在自然语言处理&#xff08;NLP&#xff09;、计算机视…

【落羽的落羽 数据结构篇】树、二叉树

文章目录 一、树1. 树的概念和结构2. 树的相关术语 二、二叉树1. 概念与结构2. 满二叉树3. 完全二叉树4. 二叉树的性质5. 二叉树的存储结构 一、树 1. 树的概念和结构 之前我们学习了线性表&#xff0c;今天我们再来接触一种全新的数据结构——树。 树是一种非线性的数据结构…

Flutter - 基础Widget

Flutter 中万物皆 Widget&#xff0c;基础Widget 同步对应 Android View. 普通文本 Text /*** 控制文本样式统一使用 style:TextStyle, 例&#xff1a;fontSize(字体大小),color(颜色),shadows(阴影)等等* 控制文本布局需单独设置&#xff1a;* textAlign(文不对齐方式)* te…