数据结构:队列(链表和数组模拟实现)

目录

1.何为队列

2.链表模拟实现

2.1 节点和队列创建

2.2 初始化队列

2.3 入队操作

2.4 出队操作

2.5 遍历队列

2.6 获取队首和队尾元素

2.7 判断队列是否为空

2.8 完整实现

3. 数组模拟实现

3.1 创建队列

3.2 入队和出队操作

3.3 遍历队列

3.4 获取队首和队尾元素

 3.5 判断队列是否为空

3.6 完整实现


1.何为队列

       队列也是一种数据结构,队列和栈不同的是,栈是先进后出,而队列是先进先出,这跟我们平时排队是一样的,先排的先办完事走,后排的后走,队列又被称为先进先出的线性表,简称FIFO(First In First Out)

       那队列是怎么来实现的呢?下面从链表和数组两个方面来模拟实现

2.链表模拟实现

2.1 节点和队列创建

       我们用链表来模拟每个队列元素,可以用链表节点来表示,data是数据域,next是指针域

typedef struct QueueNode
{int data;struct QueueNode* next;
}QueueNode;

      栈有栈顶,那队列也应该有队首和队尾

typedef struct Queue
{QueueNode* head, * tail;int size;
}Queue;

2.2 初始化队列

      创建一个队列和队首、队尾,并进行初始化

void QueueCreate(Queue* que)
{que->head = NULL;que->tail = NULL;que->size = 0;
}

2.3 入队操作

      万事具备,就差元素入队填满队列了!

      队列的插入操作叫做入队,它是将数据元素从队尾进行插入的过程

      4号元素是原先的队尾,在它后面插入元素6,就是入队的过程

      我们首先创建一个值为data的队列节点vtx,如果队尾非空,则将vtx作为队尾元素的后继,否则将队首元素置为vtx,队尾元素变成vtx,队列的长度加一。

void QueueEnter(Queue* que, int data)//入队就是将元素从队尾插入的过程
{QueueNode* vtx = (QueueNode*)malloc(sizeof(QueueNode));vtx->data = data;vtx->next = NULL;if (que->tail){que->tail->next = vtx;}else{que->head = vtx;}que->tail = vtx;que->size++;
}

2.4 出队操作

      队列的删除操作叫做出队,它是将队首元素进行删除的过程。

      将队首变成原先队首的后继元素,就实现了出队操作

      我们将队首元素缓存到temp中,将当前的队首变成temp的后继,释放temp的内存,队列长度减一,如果此时队列为空,则将队尾置为空。

void QueueDelete(Queue* que)
{QueueNode* temp = que->head;que->head = temp->next;free(temp);que->size--;if (que->size == 0){que->tail = NULL;}

2.5 遍历队列

    我们建立一个cur指向队首,如果cur!=NULL,则cur变为cur的后继

void QueueTravel(Queue* que)
{QueueNode* cur = que->head;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}

2.6 获取队首和队尾元素

int QueueGetFront(Queue* que)//获取队首元素
{return que->head->data;
}
int QueueGetBack(Queue* que)//获取队尾元素
{return que->tail->data;
}

2.7 判断队列是否为空

     如果队首等于队尾,说明队列为空,否则队列不为空。

bool QueueIsEmpty(Queue* que)
{return que ->head == que->tail;
}

2.8 完整实现

#include<stdio.h>
#include<stdlib.h>
typedef struct QueueNode//创建队列节点
{int data;struct QueueNode* next;
}QueueNode;
typedef struct Queue//创建队列结构
{QueueNode* head, * tail;//队首允许删除,队尾允许插入int size;
}Queue;
void QueueCreate(Queue* que)//队列初始化
{que->head = NULL;que->tail = NULL;que->size = 0;
}
void QueueEnter(Queue* que, int data)//入队就是将元素从队尾插入的过程
{QueueNode* vtx = (QueueNode*)malloc(sizeof(QueueNode));vtx->data = data;vtx->next = NULL;if (que->tail){que->tail->next = vtx;}else{que->head = vtx;}que->tail = vtx;que->size++;
}
void QueueDelete(Queue* que)//出队就是将元素从队尾删除的过程
{QueueNode* temp = que->head;que->head = temp->next;free(temp);que->size--;if (que->size == 0){que->tail = NULL;}
}
void QueueTravel(Queue* que)//队列的遍历
{QueueNode* cur = que->head;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}
int QueueGetFront(Queue* que)//获取队首元素
{return que->head->data;
}
int QueueGetBack(Queue* que)//获取队尾元素
{return que->tail->data;
}
bool QueueIsEmpty(Queue* que)//判断队列是否为空
{return que ->head == que->tail;
}
int main()
{Queue* que = (Queue*)malloc(sizeof(Queue));QueueCreate(que);int n;scanf_s("%d\n", &n);//执行n次入队操作while (n--){int data;scanf_s("%d", &data);QueueEnter(que, data);}//遍历并打印队列元素QueueTravel(que);//打印队首元素printf("队首元素为:%d\n", QueueGetFront(que));//打印队尾元素printf("队尾元素为:%d\n", QueueGetBack(que));//判断队列是否为空printf("%d",QueueIsEmpty(que));return 0;}

3. 数组模拟实现

3.1 创建队列

     在用数组创建队列时,不需要我们开辟空间,数组已经开好了

const int N = 100010;
int q[N];//队列
int hh = 0;//hh表示队首
int tt = -1;//tt表示队尾

3.2 入队和出队操作

     我们只需要hh++即可完成队首元素的删除操作,并不是真的删除,而是把队首元素的下标从队列数组中剔除了。

q[++tt] = x;//入队
hh++;//出队

3.3 遍历队列

//遍历并打印队列每个元素的值
for (int i = 0; i <=tt;i++)
{printf("%d ", q[i]);
}
printf("\n");

3.4 获取队首和队尾元素

//获取队首的值
printf("队首的值为:%d\n", q[hh]);//获取队尾的值
printf("队尾的值为:%d\n", q[tt]);

3.5 判断队列是否为空

     如果hh<=tt说明队列不为空

//判断队列是否为空,如果hh<=tt,则表示不为空
if (hh <= tt)printf("队列不为空");

3.6 完整实现

#include<stdio.h>
const int N = 100010;
int q[N];
int hh = 0;//hh表示队首
int tt = -1;//tt表示队尾
int main()
{int n;scanf_s("%d", &n);while (n--){int x;scanf_s("%d", &x);q[++tt] = x;//入队操作,向队尾插入一个数}//遍历并打印队列每个元素的值for (int i = 0; i <=tt;i++){printf("%d ", q[i]);}printf("\n");hh++;//出队操作,从队首删除一个数printf("队首的值为:%d\n", q[hh]);//判断队列是否为空,如果hh<=tt,则表示不为空if (hh <= tt)printf("队列不为空");return 0;
}

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

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

相关文章

基于uniapp+vue3多端「h5+小程序+App」仿微信/抖音直播商城|uni-app+vue3小视频

uniapp-vue3-welive一款uniappvue3pinia跨端仿抖音直播商城实例。 全新基于uniappvue3vite4pinia等技术研发的一款跨平台仿制微信/抖音直播带货商城uniappvue3短视频实例项目&#xff0c;支持编译到h5小程序App端。 技术框架 编辑器&#xff1a;HbuilderX 3.98框架技术&#x…

python打开文件的方式比较

open(addr,w) 打开之后文件无论以前有什么&#xff0c;打开后都要清空 /// open(addr,r) 文件打开后&#xff0c;不删除以前内容

用python做猴子摘桃的题目,java猴子爬台阶算法

本篇文章给大家谈谈猴子爬山算法java完整代码&#xff0c;以及用python做猴子摘桃的题目&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 """ 一天一只猴子想去从山脚爬到山顶&#xff0c;途中经过一个有N个台阶的阶梯&#xff0c;但是这猴子有…

设计模式—行为型模式之模板方法模式

设计模式—行为型模式之模板方法模式 在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一个抽象类公开定义了执行它的方法的方式模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 模板方法&#xff08;Template Metho…

使用递归实现深拷贝

文章目录 为什么要使用递归什么深拷贝具体实现基础实现处理 函数处理 Symbol处理 Set处理 Map处理 循环引用 结语-源码 为什么要使用递归什么深拷贝 我们知道在 JavaScript 中可以通过使用JSON序列化来完成深拷贝&#xff0c;但是这种方法存在一些缺陷&#xff0c;比如对于函数…

xxHash - 编译, 库用法

文章目录 xxHash - 编译, 库用法概述笔记xxHash的代码库地址编译xxHash的用法自己搭建一个测试工程测试工程文件目录程序参数怎么给?-H3-H3 --binary自己写一个命令行工程, 对一个buffer来做hash测试工程(vs2019 vc console)END xxHash - 编译, 库用法 概述 给AES设置 key, …

12.29最小生成数K算法复习(注意输入输出格式),校园最短路径(通过PRE实现路径输出,以及输入输出格式注意)

7-2 最小生成树-kruskal算法 分数 15 const int maxn 1000; struct edge {int u, v, w; }e[maxn]; int n, m, f[30]; bool cmp(edge a, edge b) {return a.w < b.w; } int find(int x) {if (f[x] x) {return x;}else {f[x] find(f[x]);return f[x];} } //int arr[100…

10. UVM Environment

环境为agents, scoreboards和其他验证组件&#xff08;包括有助于在 SoC 级别重用块级环境组件的其他环境类&#xff09;提供良好的层次结构和容器。用户定义的 env 类必须从 uvm_env 类扩展。 10.1 uvm_env class hierarchy 类声明&#xff1a; virtual class uvm_env extend…

Android长按图标展示快捷方式

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {new Thread(() -> {// 获取ShortcutManager实例ShortcutManager shortcutManager getSystemService(ShortcutManager.class);// 创建要添加的快捷方式ShortcutInfo.Builder shortcutBuilder new ShortcutInfo.Bui…

数据结构模拟实现LinkedList双向不循环链表

目录 一、双向不循环链表的概念 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size方法 &#xff08;3&#xff09;contains方法 &#xff08;4&#xff09;addFirst方法 &#xff08;5&#xff09;addLast方法 …

【Java基础篇】While(true) 和 for(;;)哪个性能更好呢

两个无限循环的性能分析 ✔️两者反编译比较 ✔️两者反编译比较 While(true) 和 for(; &#x1f609; 都是做无限循环的代码&#xff0c;他们两个有什么区别呢&#xff1f; 关于这个问题&#xff0c;网上有很多的讨论&#xff0c;今天我收到私信&#xff0c;所以凑着假期&…

软件功耗管理

一、背景 功耗管理是由软件、处理器、外设、电源等一起构成的系统问题。 App中很小的低效行为在整个系统中累加后&#xff0c;会对电池寿命、性能、响应速度和温度产生明显的影响。作为app开发人员&#xff0c;我们有责任确保我们的app尽可能高效地运行。使用苹果推荐的API&a…