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

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


文章目录

  • 数据结构【线性表篇】(四)
  • 前言
    • 为什么突然想学算法了?
    • 为什么选择码蹄集作为刷题软件?
  • 目录
  • 一、栈
    • (一)、栈的顺序存储
    • (二)、栈的链式存储
    • (三)、共享栈
  • 二、队列
    • (一)、队列的顺序存储
    • (二)、队列的链式存储
  • 三、结语


前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


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

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


目录

一、栈

(一)、栈的顺序存储

参考代码

//顺序栈
#include<bits/stdc++.h>
using namespace std;#define MaxSize 10                      //定义栈中元素的最大个数//顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)
typedef struct{int 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,int x){if(S.top==MaxSize-1)               //栈满(top==MaxSize),报错return false;S.top = S.top+1;                   //指针先加1S.data[S.top]=x;                   //新元素入栈//上两句等价于S.data[++S.top]=x;      *注意++S.top,而不是S.top++return true;
}//出栈操作
int Pop(SqStack &S){int x;if(S.top==-1)                       //栈空,报错,返回-1return -1;x = S.data[S.top];                  //栈顶元素先出栈S.top = S.top-1;                    //指针再减1//上两句等价于x = S.data[S.top--];return x;
}//读栈顶元素
int GetTop(SqStack S){int x;if(S.top==-1)                       //栈顶,报错,返回-1return -1;x=S.data[S.top];                    //x记录栈顶元素return x;
}void testSqStack(){SqStack S;                          //声明一个顺序栈(分配空间)InitStack(S);                    //初始化栈Push(S,1);                    //新元素入栈Push(S,2);Push(S,3);if(!SqStackEmpty(S)){               //判断栈空cout<<"栈非空"<<endl;}else cout<<"栈空"<<endl;int x = GetTop(S);                  //读取栈顶元素xcout<<x<<endl;int x1 = Pop(S);                 //弹出栈顶元素x1cout<<x1<<endl;int x2 = GetTop(S);                 //读取栈顶元素x2cout<<x2<<endl;}
int main(){testSqStack();return 0;
}

(二)、栈的链式存储

#include<bits/stdc++.h>
using namespace std;typedef struct Linknode{int data;                               //数据域struct Linknode *next;                    //指针域
}  *LiStack;int main(){return 0;
} 

(三)、共享栈

#include<bits/stdc++.h>
#define MaxSize 10                           //定义栈中元素的最大个数
typedef struct {int data[MaxSize];                       //静态数组存放栈中元素int top0;                                //0号栈栈顶指针int top1;                                //1号栈栈顶指针
}ShStack;//初始化栈
void InitStack(ShStack &S){S.top0 = -1;                             //初始化栈顶指针S.top1 = MaxSize;
}//栈满的条件:top0+1==top1

二、队列

(一)、队列的顺序存储

#include<bits/stdc++.h>
using namespace std;
#define MaxSize 10                         //定义队列中元素的最大个数
typedef struct{int data[MaxSize];                    //用静态数组存放队列元素int front,rear;                       //队头指针和队尾指针
}SqQueue;//初始化队列
void InitQueue(SqQueue &Q){//初始时队头、队尾指针指向0Q.rear=Q.front=0;
}//判断队列是否为空
bool SqQueueEmpty(SqQueue Q){if(Q.rear==Q.front) //队空条件return true;else return false;
}//入队
bool EnQueue(SqQueue &Q,int x){if(Q.rear==MaxSize-1) return false;       //队满则报错//if((Q.rear+1)%MaxSize==Q.front)         //循环队列Q.data[Q.rear]=x;                         //将x插入队尾Q.rear=Q.rear+1;                          //队尾指针后移//Q.rear=(Q.rear+1)%MaxSize;              //循环队列——队尾指针加1取模return true;
}//循环队列——出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue &Q,int &x){if(Q.rear==Q.front) return false;x = Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;return true;
}//获得头元素的值,用x返回
bool GetHead(SqQueue Q,int &x){if(Q.rear==Q.front) return false;       //队空则报错x = Q.data[Q.front];return true;
}void testQueue(){SqQueue Q;                              //声明一个队列(顺序存储)InitQueue(Q);                        //初始化队列if(SqQueueEmpty(Q)) cout<<"队列为空"<<endl;else cout<<"队列非空"<<endl;EnQueue(Q,1);                     //入队EnQueue(Q,2);EnQueue(Q,3);if(SqQueueEmpty(Q)) cout<<"队列为空"<<endl;else cout<<"队列非空"<<endl;int x;GetHead(Q,x);                        //获取头元素的值cout<<x<<endl;DeQueue(Q,x);                     //出队cout<<x<<endl;GetHead(Q,x);                        //获取更新后的头元素的值cout<<x<<endl;}int main(){testQueue();return 0;
}

(二)、队列的链式存储

#include<bits/stdc++.h>
using namespace std;
#define Maxsize 10typedef struct LinkNode{                    //链式队列结点int data;struct LinkNode *next;
}LinkNode;typedef struct{                              //链式队列LinkNode *front,*rear;                   //队列的队头和队尾指针
}LinkQueue;//初始化队列(带头结点)
void InitQueueWithNode(LinkQueue &Q){//初始时 front、rear都指向头结点Q.front=Q.rear=(LinkNode*) malloc(sizeof(LinkNode));Q.front->next=NULL;
}bool IsEmptyWithNode(LinkQueue Q){if(Q.front==Q.rear) return true;else return false;
}//初始化队列(不带头结点)
void InitQueueWithoutNode(LinkQueue &Q){//初始时 front、rear都指向NULLQ.front=NULL;Q.rear=NULL;
}//判断队列是否为空(不带头结点)
bool IsEmptyWithoutNode(LinkQueue Q){if(Q.front==NULL) return true;else return false;
}//新元素入队(带头结点)
void EnQueueWithNode(LinkQueue &Q,int x){LinkNode *s = (LinkNode *) malloc(sizeof(LinkNode));s->data=x;s->next=NULL;Q.rear->next=s;                         //新结点插入到rear之后Q.rear=s;                               //修改表尾指针
}//队头元素出队(带头结点)
bool DeQueueWithNode(LinkQueue &Q,int &x){if(Q.front==Q.rear)return false;                       //空队LinkNode *p=Q.front->next;x=p->data;                              //用变量x返回队头元素Q.front->next=p->next;                  //修改头结点的next指针if(Q.rear==p)                           //此次是最后一个结点出队Q.rear=Q.front;                     //修改rear指针free(p);                                //释放结点空间return true;
}//队头元素出队(不带头结点)
bool DeQueueWithoutNode(LinkQueue &Q,int &x){if(Q.front==NULL)return false;                       //空队LinkNode *p=Q.front;                    //p指向此次出队的结点x=p->data;                              //用变量x返回队头元素Q.front=p->next;                        //修改front指针if(Q.rear==p) {                         //此次是最后一个结点出队Q.front=NULL;                       //front指向NULLQ.rear=NULL;                        //rear指向NULL}free(p);                                //释放结点空间return true;
}//新元素入队(不带头结点)
void EnQueueWithoutNode(LinkQueue &Q,int x){LinkNode *s = (LinkNode *) malloc(sizeof(LinkNode));s->data=x;s->next=NULL;if(Q.front==NULL){                      //在空队列中插入第一个元素Q.front = s;                        //修改队头队尾指针Q.rear = s;}else{Q.rear->next=s;                     //新结点插入到rear结点之后Q.rear=s;                           //修改rear指针}
}//获得头元素的值,用x返回
bool GetHead(LinkQueue Q,int &x){if(Q.rear==Q.front) return false;       //队空则报错LinkNode *p=Q.front->next;x=p->data;return true;
}void testLinkQueue(){LinkQueue Q;                            //声明一个队列InitQueueWithNode(Q);                //初始化队列if(IsEmptyWithNode(Q)) cout<<"队列为空"<<endl;else cout<<"队列非空"<<endl;EnQueueWithNode(Q,1);                   //入队EnQueueWithNode(Q,2);EnQueueWithNode(Q,3);if(IsEmptyWithNode(Q)) cout<<"队列为空"<<endl;else cout<<"队列非空"<<endl;int x;                                      //出队,x返回出队元素DeQueueWithNode(Q,x);cout<<x<<endl;GetHead(Q,x);                           //获取出队后的队头元素xcout<<x<<endl;
}int main(){testLinkQueue();return 0;
}

三、结语

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

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

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

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

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

相关文章

Nginx 不同源Https请求Http 报strict-origin-when-cross-origin

原因&#xff1a; nginx代理配置url指向只开放了/* 而我/*/*多了一层路径 成功&#xff1a;

2024新版塔罗占卜网站源码风水起名附带搭建视频及文本教程

附带文本教学及视频教程安装方法以linux为例&#xff1a; 1、建议在服务器上面安装宝塔面板&#xff0c;以便操作&#xff0c;高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录&#xff0c;同时建立数据库&#xff0c;把数据文件导入数据库 3、修改核心文件conf…

python多环境管理工具——pyenv-win安装与使用教程

目录 pyenv-win简介 pyenv-win安装 配置环境变量 pyenv的基本命令 pyenv安装py环境 pyenv安装遇到问题 pycharm测试 pyenv-win简介 什么是pyenv-win&#xff1a; 是一个在windows系统上管理python版本的工具。它是pyenv的windows版本&#xff0c;旨在提供类似于unix/li…

cargo设置国内源 windows+linux

cargo默认的源比pip的源好多了&#xff0c;但是有时候速度还是很慢 一、部分国内源&#xff08;排名不分先后&#xff09; 这些源的格式用在具体的配置文件中 中国科学技术大学 [source.crates-io] replace-with ustc[source.ustc] registry "git://mirrors.ustc.ed…

Redis Cluster集群模式学习

Redis Cluster集群模式 Redis哨兵模式&#xff1a;https://blog.csdn.net/liwenyang1992/article/details/133956200 Redis Cluster集群模式示意图&#xff1a; Cluster模式是Redis3.0开始推出采用无中心结构&#xff0c;每个节点保存数据和整个集群状态&#xff0c;每个节点都…

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址&#xff1a; github地址&#xff1a;https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍&#xff1a; 眼睛注视&#xff08;eye gaze&#xff09; 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外&#xff0c;它还被用…

C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

本文主要介绍回调函数的使用&#xff0c;包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;C/C精进之路 &…

再见2023,你好2024!

大家好&#xff0c;我是老三&#xff0c;本来今天晚上打算出去转一转&#xff0c;陆家嘴打车实在太艰难了&#xff0c;一公里多的路&#xff0c;司机走了四十分钟&#xff0c;还没到&#xff0c;再加上身体不适&#xff0c;咳嗽地比较厉害&#xff0c;所以还是宅在酒店里&#…

用通俗易懂的方式讲解大模型:使用 Docker 部署大模型的训练环境

之前给大家介绍了主机安装方式——如何在 Ubuntu 操作系统下安装部署 AI 环境&#xff0c;但随着容器化技术的普及&#xff0c;越来越多的程序以容器的形式进行部署&#xff0c;通过容器的方式不仅可以简化部署流程&#xff0c;还可以随时切换不同的环境。 实际上很多云服务厂…

Java ArrayList在遍历时删除元素

文章目录 1. Arrays.asList()获取到的ArrayList只能遍历&#xff0c;不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…

目标检测-Two Stage-Mask RCNN

文章目录 前言一、Mask RCNN的网络结构和流程二、Mask RCNN的创新点总结 前言 前文目标检测-Two Stage-Faster RCNN提到了Faster RCNN主要缺点是&#xff1a; ROI Pooling有两次量化操作&#xff0c;会引入误差影响精度 Mask RCNN针对这一缺点做了改进&#xff0c;此外Mask …

数据结构——顺序栈与链式栈的实现

目录 一、概念 1、栈的定义 2、栈顶 3、栈底 二、接口 1、可写接口 1&#xff09;数据入栈 2&#xff09;数据出栈 3&#xff09;清空栈 2、只读接口 1&#xff09;获取栈顶数据 2&#xff09;获取栈元素个数 3&#xff09;栈的判空 三、栈的基本运算 四、顺序栈&…

Linux实战:部署基于Postfix 与 Dovecot 的邮件系统

一、电子邮件系统简介 在电子邮件系统中&#xff0c;为用户收发邮件的服务器名为邮件用户代理&#xff08;Mail User Agent&#xff0c;MUA&#xff09;&#xff0c;MTA &#xff08;邮件传输代理&#xff09;的工作职责是转发处理不同电子邮件服务供应商之间的邮件&#xff0…

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

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

PostgreSQL数据库的json操作

1.操作符 select json字段::json->key值 from order -- 对象域 select json字段::json->>key值 from order -- 文本 select json字段::json#>{key值} from order -- 对象域 select json字段::json#>>{key值} from order -- 文本对象域表示还能继续操作&#…

26、web攻防——通用漏洞SQL注入SqlmapOracleMongodbDB2

文章目录 OracleMongoDBsqlmap SQL注入课程体系&#xff1b; 数据库注入&#xff1a;access、mysql、mssql、oracle、mongodb、postgresql等数据类型注入&#xff1a;数字型、字符型、搜索型、加密型&#xff08;base63 json&#xff09;等提交方式注入&#xff1a;get、post、…

ES6之生成器(Generator)

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

如何使用Git进行代码版本管理

目录 建立仓库 分支管理 推送代码 问题 建立仓库 先在远程代码托管平台&#xff08;如GitHub、GitLab等&#xff09;上创建一个新的仓库 使用命令行或终端&#xff0c;进入你的本地项目目录 如果项目还没有使用Git进行版本控制&#xff0c;可以通过执行以下命令来初始…

Origin 2021软件安装包下载及安装教程

Origin 2021下载链接&#xff1a;https://docs.qq.com/doc/DUnJNb3p4VWJtUUhP 1.选中下载的压缩包&#xff0c;然后鼠标右键选择解压到"Origin 2021"文件夹 2.双击打开“Setup”文件夹 3.选中“Setup.exe”鼠标右键点击“以管理员身份运行” 4.点击“下一步" 5…

240101-5步MacOS自带软件无损快速导出iPhone照片

硬件准备&#xff1a; iphone手机Mac电脑数据线 操作步骤&#xff1a; Step 1: 找到并打开MacOS自带的图像捕捉 Step 2: 通过数据线将iphone与电脑连接Step 3&#xff1a;iphone与电脑提示“是否授权“&#xff1f; >>> “是“Step 4&#xff1a;左上角选择自己的设…