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

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


文章目录

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


前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


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

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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.hqwc.cn/news/313356.html

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

相关文章

windows go环境安装 swag

windows 下载依赖包 go get github.com/swaggo/swag/cmd/swag编译swag cd $GOPATH\pkg\mod\github.com\swaggo\swagv1.16.2\cmd\swagps: go env 获取 GOPATH位置 go installps: 此时 $GOPATH\bin下出现了 swag.exe 项目根目录下执行swag 初始化 swag init生成结果

RK3588取经之路【序章】2024/01/01

文章目录 RK3588取经之路【序章】关于本文的规划 开篇开发板整体图外设介绍 结束 RK3588取经之路【序章】 2023年前入手买了这个广州英码出场的一款开发板EVM3588-A24EG-C-B2AA&#xff08;裸板&#xff09;&#xff0c;花了2800左右&#xff0c;是不是脑子有点毛病&#xff0…

作业--day39

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…

[新版Hi3531DV200 性能强悍]

新版Hi3531DV200 性能强悍 Hi3531DV200是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。Hi3531DV200集成了ARM A53四核处理器和性能强大的神经网络推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;Hi3531DV200还…

【MySQL】数据库中为什么使用B+树不用B树

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 B树的特点和应用场景&#xff1a; B树相对于B树的优势&#xff1a; 结论&#xff1a; 结语 我的其他博客 前言 在数据…

桉木芯建筑模板与其他材质比较有何不同?

在建筑行业中&#xff0c;模板的选择对于确保工程质量和效率至关重要。桉木芯建筑模板作为市场上的一种选择&#xff0c;与其他材质的模板相比&#xff0c;具有独特的优势。能强优品木业作为专业的桉木芯建筑模板生产厂家&#xff0c;其产品充分展示了这一材质的优越性能。 材质…

基于Java SSM框架实现医院挂号系统项目【项目源码+论文说明】

基于java的SSM框架实现医院挂号上班打卡系统演示 摘要 在网络发展的时代&#xff0c;国家对人们的健康越来越重视&#xff0c;医院的医疗设备更加先进&#xff0c;医生的医术、服务水平也不断在提高&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个…

微信小程序自定义步骤条效果

微信小程序自定义一个步骤条组件&#xff0c;自定义文字在下面&#xff0c;已完成和未完成和当前进度都不一样的样式&#xff0c;可点击上一步和下一步切换流程状态&#xff0c;效果如下。 这是视频效果&#xff1a; 前端实现步骤条效果 下面我们一步步实现编码&#xff0c;自定…

Easy Rules规则引擎实战

文章目录 简介pom 规则抽象规则Rule基础规则BasicRule事实类Facts&#xff1a;map条件接口动作接口 四种规则定义方式注解方式RuleBuilder 链式Mvel和Spel表达式Yml配置 常用规则类DefaultRuleSpELRule&#xff08;Spring的表达式注入&#xff09; 组合规则UnitRuleGroup 规则引…

计算机网络物理层 习题答案及解析

2-1 下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; D &#xff09;。 A. 引脚功能 B. 接口形状 C. 信号电平 D. 传输媒体 【答案】D 【解析】 2-2 某网络在物理层规定&#xff0c;信号的电平范围为- 15V~15V &#xff0c; 电线长…

听GPT 讲Rust源代码--library/panic_unwind

File: rust/library/panic_unwind/src/seh.rs 在Rust源代码中&#xff0c;rust/library/panic_unwind/src/seh.rs这个文件的作用是实现Windows操作系统上的SEH&#xff08;Structured Exception Handling&#xff09;异常处理机制。 SEH是Windows上的一种异常处理机制&#xff…

基于Java SSM框架实现健康管理系统项目【项目源码】

基于java的SSM框架实现健康管理系统演示 JSP技术 JSP是一种跨平台的网页技术&#xff0c;最终实现网页的动态效果&#xff0c;与ASP技术类似&#xff0c;都是在HTML中混合一些程序的相关代码&#xff0c;运用语言引擎来执行代码&#xff0c;JSP能够实现与管理员的交互&#xf…