数据结构 队列

ops/2025/2/2 11:34:52/

目录

前言

一,队列的基本知识

二,用数组实现队列

三,用链表实现队列

总结


前言

接下来我们将学习队列的知识,这会让我们了解队列的基本概念和基本的功能


一,队列的基本知识

        (Queue)

我们先来研究队列的ADT,ADT这个概念我们再数据结构引论就已经知道ADT是什么东西了,总的来说我们先学习队列操作和特征

队列的特征

队列就跟上面的人排队一样,所以它就有一个自己的简称,First  In  First  Out(先进先出)
所以队列就有一个简称叫FIFO

队列的功能

栈都是再栈顶进行操作的,但是队列是再对头和对尾进行操作的

队列的基本功能:

插入push or EnQueue
删除pop or DeQueue 
返回头部front or peek
检查是否为空IsEmpty
检查是否满员IsFull

C++中插入和删除为push和pop                               C#中的插入和删除为EnQueue和DeQueue 

队列对于功能的要求

插入队尾进行操作  push=enQueue
删除对头进行操作  pop=DeQueue

这就可以参考上面的图,就是人都是队头出来的,所以队列也是一样的,删除从队列的头删除,当我们要插入的时候,就好比如队伍,我们插入是从对尾来的,所以队列也同理可得

队列的抽象视图

队列的应用

说明

我们往往都会有共享资源,但是对于用这些共享资源,我们需要进行服务请求,对于这个请求,我们可能同时又很多个,所以我们可以运用队列这个数据结构,让这些请求进行排队,每一次处理只可以处理一个请求,这样就会做的十分又条理,先来的先享受服务

实例

计算机的处理器就是一个共享资源,很多很多的程序或者说是进程需要处理器的时间片处理的,处理器每次只可以对一个进程进行服务,处理器用来执行指令,算术,和逻辑运算

补充:处理器的时间片是什么呢?

计算机里面的处理器时间片是把进程里面的每一个东西细分化,就比如:我的电脑是边听歌边打游戏的,我的电脑处理器会把这个进程细分化,比如我游戏角色正在跳跃,我们处理器就会处理游戏的跳跃,然后再取处理音乐,这个时间非常短,所以使用者是感受不到的,这个就是处理器的时间片

 

二,用数组实现队列

ADT

Feature

Opearations

1,EnQueue     2,DeQueue     3,Front     4,IsEmpty——————————O(1)

数组

Implementation

#include<iostream>
#include<queue>using namespace std;int A[10];
int rear = -1;
int front = -1;bool IsEmpty();
void EnQueue(int x);int main() 
{}bool IsEmpty() {if (front == -1 && rear == -1) {return false;}else {return true;}
}void EnQueue(int x) {if (rear == size(A) - 1) {cout << "Queue is full" << endl;return;}else if (IsEmpty()) {front = 0;rear = 0;}else {rear = rear + 1;}A[rear] = x;
}void DeQueue() {if (IsEmpty()) {return;}else if (rear == front) {front = rear = -1;}else {front = front + 1;}
}int front1(){return A[front];
}

这里是实现这个队列的,十分的简单,但是这个数组到最后都没了,前面全部都是空的,那我们要利用好前面的,所以我们来一个循环数组

这样的就是循环数组,我们只需这么改

#include<iostream>
#include<queue>using namespace std;int A[10];
int rear = -1;
int front = -1;bool IsEmpty();
void EnQueue(int x);int main() 
{}bool IsEmpty() {if (front == -1 && rear == -1) {return false;}else {return true;}
}void EnQueue(int x) {if ((rear+1)%10 == front) {cout << "Queue is full" << endl;return;}else if (IsEmpty()) {front = 0;rear = 0;}else {rear = (rear + 1) % 10;}A[rear] = x;
}void DeQueue() {if (IsEmpty()) {return;}else if (rear == front) {front = rear = -1;}else {front = (front + 1) % 10;}
}int front1(){return A[front];
}

 

三,用链表实现队列

#include <iostream>
using namespace std;// 队列节点结构
struct Node {int data;Node* next;Node(int val) : data(val), next(nullptr) {}
};// 链表实现的队列
class Queue {
private:Node* frontNode; // 头指针Node* rearNode;  // 尾指针
public:Queue() : frontNode(nullptr), rearNode(nullptr) {}// 判断队列是否为空bool isEmpty() {return frontNode == nullptr;}// 入队操作void enqueue(int val) {Node* newNode = new Node(val);if (isEmpty()) {frontNode = rearNode = newNode;} else {rearNode->next = newNode;rearNode = newNode;}}// 出队操作void dequeue() {if (isEmpty()) {cout << "Queue is empty!" << endl;return;}Node* temp = frontNode;frontNode = frontNode->next;delete temp;if (frontNode == nullptr) {rearNode = nullptr; // 如果队列为空,尾指针也置空}}// 获取队头元素int front() {if (isEmpty()) {cout << "Queue is empty!" << endl;return -1; // 返回一个错误值}return frontNode->data;}// 析构函数,释放所有节点~Queue() {while (!isEmpty()) {dequeue();}}
};int main() {Queue q;q.enqueue(10);q.enqueue(20);q.enqueue(30);cout << "Front: " << q.front() << endl; // 输出 10q.dequeue();cout << "Front after dequeue: " << q.front() << endl; // 输出 20q.dequeue();q.dequeue();q.dequeue(); // 额外出队,测试空队列情况return 0;
}

或者头插法与尾插法,这个尾插法我们升级一下用这个指针指向尾巴这样就可以让两个时间复杂度都是O(1)


总结

这个队列十分简单真的,就是头出尾进罢了


http://www.ppmy.cn/ops/155024.html

相关文章

前端【11】HTML+CSS+jQUery实战项目--实现一个简单的todolist

前端【8】HTMLCSSjavascript实战项目----实现一个简单的待办事项列表 (To-Do List)-CSDN博客 学过jQUery可以极大简化js代码的编写&#xff0c;基于之前实现的todolist小demo&#xff0c;了解如何使用 jQuery 来实现常见的动态交互功能。 修改后的js代码 关键点解析 动态添加…

通过 Docker 部署 pSQL 服务器的教程

在这篇文章中&#xff0c;我们将深入探讨如何利用 Docker 在 Azure 上快速部署 PostgreSQL&#xff08;pSQL&#xff09;服务器。这个过程不仅简单高效&#xff0c;还能为你的开发环境提供强大的支持。 如何使用 Edu 邮箱申请 Azure 订阅并开通免费的 VPS 首先&#xff0c;你…

基于SpringBoot的新闻资讯系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

C# 类与对象详解

.NET学习资料 .NET学习资料 .NET学习资料 在 C# 编程中&#xff0c;类与对象是面向对象编程的核心概念。它们让开发者能够将数据和操作数据的方法封装在一起&#xff0c;从而构建出模块化、可维护且易于扩展的程序。下面将详细介绍 C# 中类与对象的相关知识。 一、类的定义 …

变量和常量

一.变量 1.标准声明 var 变量名 变量类型 变量声明行末不需要分号 2..批量声明 package main import "fmt" func main(){var(a string b int c boold float32)}3.变量的初始化 var a int 10 var b float321.1 4.类型推导 var name"tom" var age18 fmt.Pr…

Docker + Nginx 部署个人静态博客指南

本文是一个使用 Docker 和 Nginx 部署个人静态博客的指南。通过本指南&#xff0c;您可以快速了解如何使用 Docker 和 Nginx 部署自己的静态博客网站。 前提 在开始使用本指南之前&#xff0c;请具备以下前提&#xff1a; 首先你得有个服务器服务器已经安装好Git、Vim等工具一…

【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据

文章目录 深入探讨&#xff1a;服务器如何响应前端请求及后端如何查看前端提交的数据一、服务器如何响应前端请求HTTP 请求生命周期全解析1.前端发起 HTTP 请求&#xff08;关键细节强化版&#xff09;2. 服务器接收请求&#xff08;深度优化版&#xff09; 二、后端如何查看前…

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…