24考研数据结构-串的定义和基本实现

news2024/11/26 8:22:00

目录

  • 第四章:串
  • 概论
    • 数据结构之串:定义、实现与存储结构
      • 1. 串的定义
      • 2. 串的实现方式
        • 2.1 顺序存储
        • 2.2 链式存储
      • 3. 串的基本操作
      • 4. 串的应用
      • 结论
  • 4.1串的定义和实现
    • 4.1.1串的定义
    • 4.1.2串的基本操作
        • 字符集编码
    • 4.1.3串的存储结构
      • 1. 定长顺序存储表示
        • 基本操作实现(基于方案四)
      • 2. 堆分配存储表示
      • 3. 串的链式存储
        • 结合链表思考优缺点
    • 知识回顾

第四章:串

概论

数据结构之串:定义、实现与存储结构

在计算机科学中,串(String)是由零个或多个字符组成的序列,是一种常见的数据类型。串在计算机编程中广泛应用于字符串处理、文本搜索、模式匹配等领域。本文将介绍串的定义、实现方式以及常用的存储结构。

1. 串的定义

串是由字符组成的有序序列,它是一种抽象数据类型(ADT)。串可以包含任意字符,包括字母、数字、符号以及特殊字符等。串的长度是指串中字符的个数,长度为0的串称为空串。

2. 串的实现方式

在计算机中,串的实现方式可以有两种常见的方式:顺序存储和链式存储。

2.1 顺序存储

顺序存储是将串中的字符按照顺序依次存储在一段连续的存储空间中。通常使用字符数组来实现顺序存储。例如,C语言中的字符串就是使用字符数组来表示的。

#define MAX_LENGTH 100 // 定义最大串长度
typedef struct {
    char data[MAX_LENGTH]; // 字符数组存储串中的字符
    int length; // 串的长度
} SeqString;

顺序存储的优点是存取效率高,可以快速访问串中任意位置的字符。但是由于需要预先分配一段连续的存储空间,对于长度不确定或者频繁插入删除操作的串,可能会造成空间浪费或频繁移动数据的问题。

2.2 链式存储

链式存储是使用链表的方式来表示串,每个节点存储一个字符。每个节点还包含一个指向下一个节点的指针。链式存储不需要预先分配一段连续的存储空间,可以根据需要动态分配和释放存储空间。

typedef struct Node {
    char data; // 存储字符
    struct Node* next; // 指向下一个节点的指针
} CharNode;

typedef struct {
    CharNode* head; // 头指针,指向链表的头节点
    int length; // 串的长度
} LinkString;

链式存储的优点是节省空间,可以灵活地处理串的长度变化,但是存取效率较低,需要从头节点开始依次遍历串中的字符。

3. 串的基本操作

串作为一种抽象数据类型,通常支持一些基本的操作,例如:

  • 求串的长度:获取串中字符的个数。
  • 比较两个串:判断两个串是否相等或大小关系。
  • 串连接:将两个串连接成一个新的串。
  • 子串提取:从原串中截取一部分形成一个新的串。
  • 串插入和删除:在指定位置插入字符或删除字符。

4. 串的应用

串在计算机编程中有着广泛的应用,例如:

  • 文本编辑器:文本编辑器中的文本内容通常使用串来表示和处理。
  • 搜索引擎:搜索引擎需要对搜索关键字和网页内容进行匹配,串的模式匹配功能可以实现这一目标。
  • 数据库查询:数据库中的记录通常包含字符串类型的字段,例如姓名、地址等,串的操作可以方便地进行查询和匹配。

结论

串是一种重要的数据类型,在计算机编程中有着广泛的应用。了解串的定义、实现方式和基本操作对于进行字符串处理和文本搜索等任务非常重要。在实际应用中,需要根据具体的场景和需求选择合适的存储结构和操作方法,以达到最优的性能和效率。

4.1串的定义和实现

4.1.1串的定义

  • 串: 零个或多个字符组成的有限序列,如 S = ‘iPhone 11 Pro Max?’;

  • 在这里插入图片描述

  • 串名:S是串名;

  • 串的长度:串中字符的个数n;

  • 空串:n=0时的串;

  • 子串:串中任意多个连续的字符组成的子序列称为该串的子串;

  • 主串:包含子串的串

  • 字符在主串中的位置:某个字符在串中的序号(从1开始)

  • 子串在主串中的位置:子串的第一个字符在主串中的位置;

空串 V.S 空格串:

  • M = ‘’ 是空串;
  • N = ’ ’ 是空格串;

串 V.S 线性表:

  • 串是特殊的线性表,数据元素之间呈线性关系(逻辑结构相似);
  • 串的数据对象限定为字符集:中文字符、英文字符、数字字符、标点字符…
  • 串的基本操作,如增删改除通常以子串为操作对象

4.1.2串的基本操作

在这里插入图片描述
StrCompare(S, T) 串的比较操作,参照英文词典排序方式;若S > T,返回值>0; S = T,返回值=0 (需要两个串完全相同) ; S < T,返回值<0;
在这里插入图片描述

字符集编码

在这里插入图片描述

4.1.3串的存储结构

1. 定长顺序存储表示

#define MAXLEN 255   //预定义最大串长为255

typedef struct{
    char ch[MAXLEN];   //静态数组实现(定长顺序存储)
                       //每个分量存储一个字符
                       //每个char字符占1B
    int length;        //串的实际长度
}SString;

串长的两种表示法:

  • 方案一:用一个额外的变量length来存放串的长度(保留ch[0]);

  • 方案二:用ch[0]充当length;
    优点:字符的位序和数组下标相同
    缺点: 字符串长度0-2^8-1

  • 方案三:没有length变量,以字符’\0’表示结尾(对应ASCII码的0);
    缺点:需要从头到尾遍历

  • 方案四——最终使用方案ch[0]废弃不用声明int型变量length来存放串的长度(方案一与方案二的结合)

基本操作实现(基于方案四)

#define MAXLEN 255

typedef struct{
    char ch[MAXLEN];   
    int length;       
}SString;

// 1. 求子串
bool SubString(SString &Sub, SString S, int pos, int len){
    //子串范围越界
    if (pos+len-1 > S.length) //pos+len-1是因为这样子是最后一个元素的位置
        return false;  //如下边的i<pos+len,就是i最大值是pos+len-1
    
    for (int i=pos; i<pos+len; i++)
        Sub.cn[i-pos+1] = S.ch[i];
    
    Sub.length = len;

    return true;
}

// 2. 比较两个串的大小
int StrCompare(SString S, SString T){
    for (int i; i<S.length && i<T.length; i++){
        if(S.ch[i] != T.ch[i])
            return S.ch[i] - T.ch[i];
    }
    //扫描过的所有字符都相同,则长度长的串更大
    return S.length - T.length;
}

// 3. 定位操作
int Index(SString S, SString T){
    int i=1;
    n = StrLength(S);
    m = StrLength(T);
    SString sub;        //用于暂存子串

    while(i<=n-m+1){  //n-m+1是最后一个能取到长m的字串的位置,所以可以等于
        SubString(Sub,S,i,m);
        if(StrCompare(Sub,T)!=0)
            ++i;
        else 
            return i;    // 返回子串在主串中的位置
    }
    return 0;            //S中不存在与T相等的子串
}


2. 堆分配存储表示

堆存储结构的特点:仍以一组空间足够大的、地址连续的存储单元依次存放字符序列,但它们的存储空间是在程序执行过程种动态分配的 。
通常,C语言提供的串类型就是以这种存储方式实现的。由动态分配函数malloc()分配一块实际串长所需要的存储空间(“堆”),如果分配成功,则返回此空间的起始地址,作为串的基址。由free()释放串不再需要的空间

堆存储结构的优点堆存储结构既有顺序存储结构的特点,处理(随机取子串)方便,操作中对串长又没有任何限制,更显灵活,因此在串处理的应用程序中常被采用。

//动态数组实现
typedef struct{
    char *ch;           //按串长分配存储区,ch指向串的基地址
    int length;         //串的长度
}HString;

HString S;
S.ch = (char *) malloc(MAXLINE * sizeof(char)); //基地址指针指向连续空间的起始位置
                                                //malloc()需要手动free()
S.length;


3. 串的链式存储

typedef struct StringNode{
    char ch;           //每个结点存1个字符
    struct StringNode *next;
}StringNode, * String;


问题:存储密度低,每个字符1B,每个指针4B(32位的机器上)
解决方案:每一个链表的结点存储多个字符——每个结点称为块——块链结构

typedef struct StringNode{
    char ch[4];           //每个结点存多个个字符
    struct StringNode *next;
}StringNode, * String;


结合链表思考优缺点

  • 存储分配角度:链式存储的字符串无需占用连续空间,存储空间分配更灵活
  • 操作角度:若要在字符串中插入或删除某些字符,则顺序存储方式需要移动大量字符,而链式存储不用;
  • 若要按位序查找字符,则顺序存储支持随机访问,而链式存储只支持顺序访

知识回顾

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海外ASO优化之通过应用商店优化来获得自然用户

应用商店优化需要我们跟踪关键词的数据&#xff0c;从而评估我们的ASO策略有效性。跟踪我们选择的时间段和国家/地区的重要搜索查询的历史排名和应用程序的最佳位置。根据我们关注的每个应用的关键词&#xff0c;位置&#xff0c;特色&#xff0c;评论和更新&#xff0c;立即了…

性能压力测试的重要性与实施方法

性能压力测试是在软件开发过程中评估系统在不同负载条件下的表现和稳定性的关键步骤。这种测试是为了确定系统在正常和峰值负载下的性能表现&#xff0c;以验证系统是否能够满足用户需求&#xff0c;同时发现潜在的性能问题并加以解决。 首先&#xff0c;性能压力测试对于确保系…

【HMS Core】融合搜索无法打开搜索服务连接问题

【关键字】 HMS、搜索服务、融合搜索 【问题描述】 有开发者反馈在集成搜索服务-融合搜索时&#xff0c;出现了无法打开搜索服务连接的问题。 严格按照官方文档集成&#xff0c;配置&#xff0c;权限已添加 searchServiceAbility .connect(new ServiceConnectCallback() { …

牛客网Verilog刷题——VL46

牛客网Verilog刷题——VL46 题目解析答案 题目 根据题目提供的双口RAM代码和接口描述&#xff0c;实现同步FIFO&#xff0c;要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。   双口RAM端口说明&#xff1a; 同步FIFO端口说明&#xff1a; 双口RAM代码如下&#xff…

1、Tomcat

java介绍 Java语言和平台由以下几个主要部分组成&#xff1a; 1、Java编程语言(Java Language)&#xff1a;这是Java的核心部分&#xff0c;包括Java语法、关键字、数据类型、运算符、控制结构等。程序员使用Java语言来编写应用程序的源代码。 2、Java开发工具包(Java Developm…

企业可以申请DV https证书吗

DV https证书是有基础认证的数字证书&#xff0c;所以DV https证书也可以叫DV基础型https证书。DV基础型https证书是众多https证书中既支持个人&#xff0c;也支持企事业单位申请的https证书&#xff0c;所以企事业单位都可以申请DV基础型https证书&#xff0c;不论是企业门户网…

价值 1k 嵌入式面试题-计算机网络 OSI

开门见山 请讲下 OSI 各层协议的主要功能&#xff1f; 常见问题 回答不系统回答不确切无法和实际网络协议做关联对应 答题思路 OSI 代表了开放互联系统中信息从一台计算机的一个软件应用流到另一个计算机的另一个软件应用的参考模型 OSI 包含 7 层&#xff0c;每一层负责特…

【JavaSE】- 5min拿下泛型!

泛型 1.1 泛型的定义1.2 泛型细节2.1 泛型类2.2 泛型方法2.3 泛型接口2.4 泛型的通配符 1.1 泛型的定义 泛型的介绍 提供了编译时类型安全检测机制 泛型的好处 把运行时期的问题提前到了编译期间避免了强制类型转换&#xff0c;造成了代码的不优雅 泛型的定义格式 <类型&…

7种方法!教你如何使用Telerik UI for ASP.NET定制编辑器

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 Telerik UI for ASP.NET …

自己动手从零写桌面操作系统GrapeOS——4.1 在VirtualBox中安装CentOS

之前讲解开发环境时并没有介绍具体的安装过程&#xff0c;有网友反应CentOS的安装配置有问题&#xff0c;尤其是共享文件夹。本讲我们就来补充介绍一下在VirtualBox中安装配置CentOS的具体过程&#xff0c;彻底解决GrapeOS开发环境问题。 一、新建虚拟机 1.在VirtulBox中点击…

电脑主机启动不起来怎么回事?2023最新解决方法!

“我的电脑刚用才没多久&#xff0c;怎么主机突然就启动不起来了呢&#xff1f;试了很多方法还是不行&#xff0c;这我该怎么解决呀&#xff1f;” 在日常的学习和工作中&#xff0c;大多数人已经离不开电脑了。当然&#xff0c;在使用电脑的过程中&#xff0c;会遇到各种各样…

[Docker]入门之docker-compose

一&#xff0c;Docker-compose简介 1&#xff0c;Docker-compose简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c…

Qt使用QQuickWidget的输入法问题(Qt5.12及以前)

Qt使用QQuickWidget的输入法问题&#xff08;Qt5.12及以前&#xff09; 最近有网友表示&#xff0c;在使用QQuickWidget嵌入到QWidget时&#xff0c;QML内部的输入法会有问题。 主要表现是&#xff0c;当焦点从QWidget&#xff08;比如QLineEdit&#xff09;切换到QQuickWidg…

Spring学习笔记——1

Spring学习笔记——1 一、Spring入门1.1、学习路线1.2、传统Javaweb开发困惑及解决方法1.3、三种思想的提出和框架概念1.3.1、IoC、DI和AOP思想提出1.3.2、框架的基本特点 1.4、Spring概述1.5、BeanFactory快速入门1.6、ApplicationContext快速入门1.7、BeanFactory与Applicati…

复习第四章集合+多线程

一、集合 Collection派生 我们在使用集合的时候其实更多的是使用List、Set、Map集合进行操作&#xff0c;List、Set又继承自Collection Collection下的集合为单列集合&#xff0c;可以理解为一个集合当中的数据只代表一个“对象”。 Map派生 Map代表的是存储key-value对的集…

为高性能计算构建,由亚马逊云科技Amazon Graviton3E驱动的最新实例正式可用

亚马逊云科技宣布两款基于最新一代自研芯片Amazon Graviton3E的新实例Amazon Elastic Compute Cloud&#xff08;Amazon EC2&#xff09;Hpc7g和Amazon EC2 C7gn正式可用。 其中&#xff0c;Hpc7g实例专为计算和网络密集型高性能计算&#xff08;HPC&#xff09;工作负载而构建…

K8s安全配置:CIS基准与kube-bench工具

01、概述 K8s集群往往会因为配置不当导致存在入侵风险&#xff0c;如K8S组件的未授权访问、容器逃逸和横向攻击等。为了保护K8s集群的安全&#xff0c;我们必须仔细检查安全配置。 CIS Kubernetes基准提供了集群安全配置的最佳实践&#xff0c;主要聚焦在两个方面&#xff1a;主…

axios 网络应用 axios基本使用

之前学了vue本地应用&#xff0c;通过Vue提供的各种指令&#xff0c;对本地的数据进行操作。 但是现在很少有纯本地的应用了&#xff0c;或多或少都会进行网络数据的交互。这个就想要axios&#xff0c;内部是阿贾克斯&#xff0c;封装之后使用起来更加便捷&#xff0c;并且功能…

【Java练习题汇总】《第一行代码JAVA》综合测试一,汇总Java练习题

Java练习题 综合测试一 1️⃣ 综合测试一 1️⃣ 综合测试一 下面关于Java 的特点不正确的一项是( )。 A. Java 具备跨平台性&#xff0c;可以在任意的操作系统间进行移植 B. Java 编写的程序可以直接解释执行&#xff0c;属于解释型的编程语言类型 C. Java 中具备垃圾收集机制…

Linux安装VScode

从本篇开始&#xff0c;打算有时间就写写在VScode中编写一些ros相关的案例程序用于学习记录。本篇是如何在Linux安装VScode的第一篇。 一、下载VScode 在Linux中打开浏览器输入&#xff1a;https://code.visualstudio.com/Download&#xff0c;选择与你电脑相匹配的版本下载&…