数据结构【线性表篇】(五)

数据结构【线性表篇】(五)


文章目录

  • 数据结构【线性表篇】(五)
  • 前言
    • 为什么突然想学算法了?
    • 为什么选择码蹄集作为刷题软件?
  • 目录
  • 一、队列
    • 括号匹配(代码用不上,需改成加减乘除应用题)
  • 二、串
    • (一)、串的存储结构
    • (二)、朴素模式匹配&KMP算法
  • 三、结语


前言

在这里插入图片描述

为什么突然想学算法了?

> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下竞争压力逐渐增大,无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个寒假巩固速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

在这里插入图片描述


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
.
在这里插入图片描述


目录

一、队列

括号匹配(代码用不上,需改成加减乘除应用题)

参考代码

#include<bits/stdc++.h>
using namespace std;

#define MaxSize 10                      //定义栈中元素的最大个数

//顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)
typedef struct{
    char data[MaxSize];                  //静态数组存放栈中元素
    int top;                            //栈顶指针
}SqStack;

void InitStack(SqStack &S){
    S.top = 1;                          //初始化栈顶指针
    //也可以使其等于0,然后判空时,把-1改为0
}

//判断栈空
bool SqStackEmpty(SqStack S){
    if(S.top==-1) return true;
    else return false;
}

//新元素入栈
bool Push(SqStack &S,char x){
    if(S.top==MaxSize-1)               //栈满(top==MaxSize),报错
        return false;
    S.top = S.top+1;                   //指针先加1
    S.data[S.top]=x;                   //新元素入栈
    //上两句等价于S.data[++S.top]=x;      *注意++S.top,而不是S.top++
    return true;
}

//出栈操作
bool Pop(SqStack &S,char x){
    if(S.top==-1)                       //栈空,报错,返回-1
        return false;
    x = S.data[S.top];                  //栈顶元素先出栈
    S.top = S.top-1;                    //指针再减1
    //上两句等价于x = S.data[S.top--];
    return true;
}

//括号匹配算法
bool bracketCheck(char str[],int length){
    SqStack S;
    InitStack(S);                   //初始化一个栈
    for(int i=0;i<length;i++){
        if(str[i]=='(' || str[i]=='[' || str[i]=='{'){
            Push(S,str[i]);         //扫描到左括号,入栈
        }else{
            if(SqStackEmpty(S))         //扫描到右括号,当前栈空
                return false;
            char topElem;
            Pop(S,topElem);          //栈顶元素出栈
            if(str[i]==')'&&topElem!='(')
                return false;
            if(str[i]==']'&&topElem!='[')
                return false;
            if(str[i]=='}'&&topElem!='{')
                return false;
        }
    }
    return SqStackEmpty(S);             //检索完全部括号后,栈空说明匹配成功

}

int main(){
    char str[]={'{','2','*','4','+','[','4','+','(','6','/','2',')',']','}'};
    bracketCheck(str,15);
    return 0;
}

二、串

(一)、串的存储结构

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

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

//动态数组实现(堆分配存储)
typedef struct{
    char *ch;                       //按串长分配存储区,ch指向串的基地址
    int length;                     //串的长度
}HString;
HString S;
S.ch = (char *)malloc(MAXLEN *sizeof(char));        //用完需要手动free
S.length = 0;

//串的链式存储
typedef struct StringNode{
    char ch;                        //每个节点存1个字符,也可以用char ch[4],来提高存储密度
    struct StringNode *next;
}StringNode,*String;

/*
 StrAssign(&T,chars):赋值操作。把串T赋值为chars。
 StrCopy(&T,S):复制操作。由串s复制得到串T。
 StrEmpty(S):判空操作。若s为空串,则返回TRUE,否则返回FALSE。
 StrLength(S):求串长。返回串s的元素个数。
 ClearString(&S):清空操作。将s清为空串。
 DestroyString(&S):销毁串。将串s销毁(回收存储空间)。
 Concat(&T,S1,S2):串连接。用T返回由S1和S2连接而成的新串
*/

//SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
//求子串
bool SubString(SString &Sub, SString S, int pos,int len){
    //子串范围越界
    if(pos+len-1 > S.length) return false;
    for(int i=pos;i<pos+len;i++)
        Sub.ch[i-pos+1] = S.ch[i];
    Sub.length = len;
    return true;
}

//StrCompare(S,T):比较操作。若S>T,则返回值>o;若S=T,则返回值=0;若S<T,则返回值<0。
//比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
int StrCompare(SString S,SString T){
    for(int i=1;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;
}

//Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则这回它在主串S中第一次出现的位置;否则函数值为0。
int Index(SString S, SString T){
    int i=1,n=StrLength(S),m=StrLength(T);
    SString sub;            //用于暂存子串
    while(i<=n-m+1){
        SubString(sub,S,i,m);
        if(StrCompare(sub,T)!=0)    ++i;
        else return i;      //返回子串在主串中的位置
    }
    return 0;               //S中不存在与T相等的子串
}

(二)、朴素模式匹配&KMP算法


//朴素模式匹配,最坏时间复杂度O(mn)
int Index(SString S,SString T){
    int i=1,j=1;
    while(i<=S.length && j<=T.length){
        if(S.ch[i]==T.ch[j]){
            ++i,++j;        //继续比较后继字符
        }else{              //匹配失败时,主串指针i疯狂回溯
            i = i-j+2;
            j=1;            //指针后退重新开始匹配
        }
    }
    if(j>T.length)
        return i-T.length;
    else
        return 0;
}

//KMP算法,最坏时间复杂度O(m+n),其中,求next数组时间复杂度O(m),模式匹配过程最坏时间复杂度O(n)
int Index_KMP(SString S,SString T,int next[]){
    int i=1,j=1;
    while(i<=S.length && j<=T.length){
        if(j==0 || S.ch[i]==T.ch[j]){
            ++i,++j;        //继续比较后继字符
        }else{              //匹配失败时,主串指针i不回溯
            j=next[j];      //模式串向右移动
        }
        if(j>T.length)
            return i-T.length;  //匹配成功
        else
            return 0;
    }
}

三、结语

感谢大家一直以来的不断支持与鼓励,码题集题库中的进阶塔350题正在逐步更新,之后会逐步跟进星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?

另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~

愿你的结局,配得上你一路的颠沛流离。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

异常控制流ECF

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、异常控制流&#xff08;ECF) 现代…

国科大图像处理2023速通期末——汇总2017-2019

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2&#xff0c;这将使得显示系统产生比希望的效果更暗的图像&#xff0c;此时伽马校正通常在信号进入显示器前被进行预处理&#xff0c;令p…

目标检测 YOLOv5 - 推理时的数据增强

目标检测 YOLOv5 - 推理时的数据增强 flyfish 版本 YOLOv5 6.2 参考地址 https://github.com/ultralytics/yolov5/issues/303在训练时可以使用数据增强&#xff0c;在推理阶段也可以使用数据增强 在测试使用数据增强有个名字叫做Test-Time Augmentation (TTA) 实际使用中使…

Ps:亮度蒙版 - 混合颜色带方法

所谓“亮度蒙版”&#xff0c;就是根据图像的明暗程度进行选区并建立蒙版&#xff0c;这样便于对图像上进行分级调色。 Photoshop 支持众多的第三方亮度蒙版插件。如&#xff0c;TKActions、Lumenzia、ADP Pro、Raya Pro、LIM、EasyPanel、Introducing InstaMask等等。如此多的…

python实现平滑线性滤波器——数字图像处理

原理&#xff1a; 平滑线性滤波器是一种在图像处理中广泛使用的工具&#xff0c;主要用于降低图像噪声或模糊细节。这些滤波器的核心原理基于对图像中每个像素及其邻域像素的线性组合。 邻域平均&#xff1a; 平滑线性滤波器通过对目标像素及其周围邻域像素的强度值取平均来工…

【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询

作者推荐 【动态规划】【字符串】C算法&#xff1a;正则表达式匹配 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 二分查找算法合集 回文串重新排列查询 给你一个长度为 偶数 n &#xff0c;下标从 0 开始的字符…

Couchdb 垂直权限绕过漏洞(CVE-2017-12635)

一、漏洞描述 Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台…

YOLOv8训练损失、mAP画图功能 | 支持多结果对比,多结果绘在一个图片(科研必备)

一、本文介绍 本文给大家带来的是YOLOv8系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

QGIS004:【01矢量创建工具箱】-创建网格、从表格创建点图层、导入带有地理标签的照片、点转线

摘要:QGIS矢量创建工具箱包括创建网格、从表格创建点图层、导入带有地理标签的照片、点转线等选项,本文介绍各选项的基本操作。 实验数据: 链接:https://pan.baidu.com/s/1PcF2ZfE5GM6fFg6rs3GeHA?pwd=rha4 提取码:rha4 一、创建网格 1.网格类型(点) 2.网格类型(线)…

【Spring实战】15 Logback

文章目录 1. 依赖2. 配置3. 打印日志4. 启动程序5. 验证6. 调整日志级别7. 代码详细总结 Spring 作为一个现代化的 Java 开发框架&#xff0c;提供了很多便利的功能&#xff0c;其中包括灵活而强大的日志记录。本文将介绍如何结合 Spring 和 Logback 配置和使用日志&#xff0c…

LM386简易OCL功放电路

LM386简易OCL功放电路是使用低功耗集成功率放大器LM386构成的OCL功放电路&#xff0c;电路结构简单&#xff0c;容易调试&#xff0c;非常适于自制。 电路工作原理&#xff1a;图中IC1和IC2是两片集成功放LM386&#xff0c;接成OCL电路。C1起到电源滤波及退耦作用&#xff0c;C…

如何通过使用说明书的优化降低售后支持成本?

随着市场竞争的加剧&#xff0c;售后服务已成为企业保持竞争优势的关键因素之一。而使用说明书作为产品的重要组成部分&#xff0c;与售后服务之间存在着密切的关系。接下来就探讨一下如何通过优化使用说明书降低售后支持成本&#xff0c;提升售后服务质量。 一、使用说明书对售…

DevOps系列之 JNI实现Java调用C的实现案例

JNI&#xff08;Java Native Interface&#xff09;允许Java代码与其他语言编写的代码进行交互。以下是一个简单的JNI示例&#xff0c;演示如何使用JNI在Java中调用C/C函数。 最终的目录结构如下&#xff1a; JNI&#xff08;Java Native Interface&#xff09;允许Java代码与其…

【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III

作者推荐 【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值 本文涉及的基础知识点 C算法&#xff1a;滑动窗口总结 题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j)&#xff1a; i ! j, abs(i - j) < indexDi…

如何在2024年编写Android应用程序

如何在2024年编写Android应用程序 本文将介绍以下内容&#xff1a; 针对性能进行优化的单活动多屏幕应用程序 &#x1f92b;&#xff08;没有片段&#xff09;。应用程序架构和模块化 → 每个层面。Jetpack Compose 导航。Firestore。应用程序架构&#xff08;模块化特征驱动…

BikeDNA(二) OSM数据的内在分析1

BikeDNA&#xff08;二&#xff09; OSM数据的内在分析1 该笔记本分析给定区域的 OSM 自行车基础设施数据的质量。 质量评估是“内在的”&#xff0c;即仅基于一个输入数据集&#xff0c;而不使用外部信息。 对于将 OSM 数据与用户提供的参考数据集进行比较的外在质量评估&…

多人协同开发git flow,创建初始化项目版本

文章目录 多人协同开发git flow&#xff0c;创建初始化项目版本1.gitee创建组织模拟多人协同开发2.git tag 打标签3.git push origin --tags 多人协同开发git flow&#xff0c;创建初始化项目版本 1.gitee创建组织模拟多人协同开发 组织中新建仓库 推送代码到我们组织的仓库 2…

堆的应用:堆排序和TOP-K问题

上次才讲完堆的相关问题&#xff1a;二叉树顺序结构与堆的概念及性质&#xff08;c语言实现堆 那今天就接着来进行堆的主要两方面的应用&#xff1a;堆排序和TOP-K问题 文章目录 1.堆排序1.1概念、思路及代码1.2改良代码&#xff08;最初建立大堆用AdjustDow&#xff09; 2. TO…

2.3 设计FMEA步骤三:功能分析

2.3.1 目的 设计功能分析确保要求/规范中的功能适当分配给系统要素。分析必须使用功能术语进行编写。 功能分析地主要目标是: 产品或过程功能可视化。制作功能树/网或功能分析表格和参数图(P图)。展开与顾客(内部和外部)功能相关的要求。将要求或特性与功能关联。促进工…

测试用例设计方法:正交试验冲锋

1 引言 上篇讲了因果图和判定表法&#xff0c;而这两种方法在变量值很多、排列组合数量极大的场景下&#xff0c;会生成非常庞大且冗余的测试用例&#xff0c;此时我们很难对所有组合场景进行全量测试用例覆盖&#xff0c;基于此短板&#xff0c;正交试验法应运而生。 2 概念及…