队列——一种操作受限的线性表

队列

队列(Queue)简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队,删除元素称为出队或离队。队列中的元素是先进先出(First In First Out,FIFO)。

队头(Front):允许删除的一端,又称队首。

队尾(Rear):允许插入的一端。

		————————————————————
出队列<---- a1 a2 a3 a4 a5 <-----入队列
		————————————————————
		^				^
		|				|
		队头			 队尾

循环队列

用数组实现循环队列

#define MAX_SIZE 6
typedef int ElemType;
typedef struct {
    // 数组 存储MAX_SIZE - 1个元素
    ElemType data[MAX_SIZE];
    // 队列头 队列尾
    int front, rear;
} SqQueue;

请添加图片描述

#include <stdio.h>


#define MAX_SIZE 6
typedef int ElemType;
typedef struct {
    // 数组 存储MAX_SIZE - 1个元素
    ElemType data[MAX_SIZE];
    // 队列头 队列尾
    int front, rear;
} SqQueue;


/*
 * 初始化循环队列
 */
void init_queue(SqQueue &Q) {

    // 初始化循环队列: 让头部和尾部都指向零号
    Q.front = Q.rear = 0;
}


/*
 * 判断循环队列是否为空
 */
bool queue_empty(SqQueue Q) {
    return Q.front == Q.rear;
}


/*
 * 入队
 */
bool enqueue(SqQueue &Q, ElemType data) {
    // 判断队列是否已满
    if ((Q.rear + 1) % MAX_SIZE == Q.front) {
        return false;
    }

    // 放入元素
    Q.data[Q.rear] = data;
    // rear加1
    Q.rear = (Q.rear + 1) % MAX_SIZE;

    return true;
}


/*
 * 出队
 */
bool dequeue(SqQueue &Q, ElemType &elem) {
    // 判断队列是否为空
    if (queue_empty(Q)) {
        return false;
    }

    // 队首元素
    elem = Q.data[Q.front];
    // front加1
    Q.front = (Q.front + 1) % MAX_SIZE;

    return true;
}

int main() {

    SqQueue Q;
    // 一、初始化循环队列
    init_queue(Q);

    // 二、判断循环队列是否为空
    bool ret = queue_empty(Q);
    if (ret) {
        printf("queue is empty\n");
    }

    // 三、入队
    enqueue(Q, 3);
    enqueue(Q, 4);
    ret = enqueue(Q, 5);
    if (ret) {
        printf("enqueue success\n");
    } else {
        printf("enqueue failed\n");
    }

    // 四、出队
    ElemType elem;
    ret = dequeue(Q, elem);
    if (ret) {
        printf("dequeue succes, elem = %d\n", elem);
    } else {
        printf("dequeue failed\n");
    }
    
    enqueue(Q, 6);
    enqueue(Q, 7);
    enqueue(Q, 8);
    ret = enqueue(Q, 9);

    return 0;
}

队列

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点。

链表尾插法实现入队,链表头删法实现出队。

请添加图片描述

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LinkNode {
    ElemType data;
    struct LinkNode *next;
} LinkNode;

// 链表 先进先出
typedef struct LinkQueue {
    // 链表头/队头 链表尾/队尾
    LinkNode *front, *rear;
} LinkQueue;


/*
 * 队列的初始化(带头结点的链表实现)
 */
void init_queue(LinkQueue &Q) {
    // 头和尾指向同一个结点
    Q.front = Q.rear = (LinkNode *) malloc(sizeof(LinkNode));
    // 头结点的next指针为NULL
    Q.front->next = NULL;
}


/*
 * 判断队列是否为空
 */
bool queue_empty(LinkQueue Q) {
    if (Q.front == Q.rear) {
        return true;
    }

    return false;
}


/*
 * 入队
 */
void enqueue(LinkQueue &Q, ElemType data) {
    LinkNode *new_node = (LinkNode *) malloc(sizeof(LinkNode));
    new_node->data = data;
    new_node->next = NULL;

    // 尾指针的next指向new_node
    Q.rear->next = new_node;
    // rear指向新的尾部
    Q.rear = new_node;
}


/*
 * 出队
 */
bool dequeue(LinkQueue &Q, ElemType &elem) {
    // 判断队列是否为空
    if (queue_empty(Q)) {
        return false;
    }

    // 第一个结点
    LinkNode *q = Q.front->next;
    elem = q->data;
    Q.front->next = q->next;

    // 链表只剩一个结点时 被删除后 要改变rear
    if (Q.rear == q) {
        Q.rear = Q.front;
    }

    //让第一个结点断链
    free(q);

    return true;
}


int main() {
    // 新建队列
    LinkQueue Q;

    // 一、初始化队列
    init_queue(Q);

    // 二、判断队列是否为空
    bool ret = queue_empty(Q);
    if (ret) {
        printf("queue is empty\n");
    }

    // 三、入队
    enqueue(Q, 3);
    enqueue(Q, 4);
    enqueue(Q, 5);

    // 四、出队
    ElemType elem;
    dequeue(Q, elem);
    dequeue(Q, elem);
    ret = dequeue(Q, elem);
    if (ret) {
        printf("dequeue success element = %d\n", elem);
    } else {
        printf("dequeue failed\n");
    }

    return 0;
}

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

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

相关文章

C++设计模式-桥接模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 29. 桥接模式 桥接模式将抽象与实现分离&#xff0c;使二者可以独立地变化。 应用&#xff1a;如在游戏开发中&#xff0c;多个角色和多个武器交叉组合时。可以使用桥接模式&#xff0c;定义角色抽象类&#xff0c;武器抽象…

注册北京个体工商户条件和办理时间

在北京这座充满活力的城市中&#xff0c;每天都有无数的创业者怀揣着梦想&#xff0c;踏上创业之路。然而&#xff0c;对于许多初次接触企业注册的人来说&#xff0c;往往对注册流程和时间感到困惑。特别是选择代理服务时&#xff0c;更希望了解一个大概的时间范围。那么&#…

Flutter开发效率提升1000%,Flutter Quick教程之对Widget进行删除,剪切,粘贴

一&#xff0c;删除操作 1&#xff0c;首先我们选中要删除的Widget。 2&#xff0c;在左边的侧边栏&#xff0c;点击删除按钮&#xff0c;即可完成对组件的删除操作。 二&#xff0c;剪切。剪切是相同的道理&#xff0c;都是先选中&#xff0c;再点击对应的按钮。 1&#xff…

拿捏AVL(C++)

文章目录 前言AVL树介绍模拟实现框架查找插入验证删除完整代码 性能分析总结 前言 在本篇文章中我&#xff0c;我们将会介绍一下有关AVL树的相关内容&#xff0c;并且对一些接口进行模拟实现。 AVL树介绍 为什么会有AVL树呢&#xff1f;&#xff1f; 我们在之前学习二叉树时…

UI的学习(一)

UI的学习(一) 文章目录 UI的学习(一)UIlabelUIButtonUIButton的两种形式UIButton的事件触发 UIView多个视图之间的关系 UIWindowUIViewController一个视图推出另一个视图 定时器和视图移动UISwitchUISlider和UIProgressSlid步进器与分栏控制器UITextFieldUIScrollView有关实现它…

【Python打包成exe】

Python打包成exe 前言一、理论知识打底二、实操开始----pyinstaller【Base环境下】【这是一个失败案例】规规矩矩 总结 前言 先放点参考 这个字多&#xff0c;写得很详细⇨用 Pyinstaller 模块将 Python 程序打包成 exe 文件&#xff08;全网最全面最详细&#xff0c;万字详述…

C语言王国——内存函数

目录 1 memcpy函数 1.1 函数表达式 1.2 函数模拟 2 memmove函数 2.1 函数的表达式 2.2 函数模拟 3 memset函数 3.1 函数的表达式 3.2 函数的运用 4 memcmp函数 4.1函数的表达式&#xff1a; 4.2 函数的运用 5 结论 接上回我们讲了C语言的字符和字符串函数&#…

UI案例——登陆系统

UI的登陆界面实例 在学习了UILabel&#xff0c;UIButton&#xff0c;UIView&#xff0c;UITextField的内容之后&#xff0c;我们就可以写一个简单的登陆界面 我们可以通过UILabel来编写我们显示在登陆界面上的文字比方说下面这两行字就是通过UILabel去实现的。 下面给出一下实现…

6.2 休息日 背包问题总结

就目前所遇到的01背包与完全背包作总结。 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包 动规五部曲 1.确定…

【Linux】System V 信号量

一、信号量的概念理论渗透 1.1 基本概念 共享资源&#xff1a;多个执行流&#xff0c;可以看到的一份资源临界资源&#xff1a;被保护起来的资源 —— 保护的方式&#xff1a;同步和互斥互斥&#xff1a;任何时候只能有一个进程在访问共享资源资源&#xff0c;一定要被程序员…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转&#xff0c;然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中&#xff0c;还需要提示给用户&#xff0c;前端和后端需要作一些约定&#xff1a; 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错&#xff0c;非200为操作异常。…

基于51单片机数控直流数控电源的设计

电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行…

Win10 Edge提示兼容性问题打不开|解决浏览器兼容性问题

Edge有时候会与某些安全软件不兼容&#xff0c;导致报错 报错代码&#xff1a;STATUS_INVALID_IMAGE_HASH 解决Edge浏览器兼容性问题方法/步骤&#xff1a; 1、按 Win R 组合键&#xff0c;打开运行&#xff0c;并输入 regedit 命令&#xff0c;确定或回车&#xff0c;可以…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型&#xff0c;在新模型发布时都会给出很多评测数据&#xff0c;用以说明当前模型在不同数据集上的测评表现&#xff08;如下面llama3发布的评测数据&#xff09;。 这些评测数据是如何给出来的呢&#xff1f;这篇文章会用一个最小化的流程来还原下…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时&#xff0c;因为网络问题gradle插件包一直下载不全&#xff0c;一直build。 解决方案&#xff1a; 打开gradle>wrapper文件下gradle-wrapper.properties&#xff0c;查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…

kafka 发送文件二进制流及使用header发送附属信息

文章目录 背景案例发送方接收方 背景 需要使用kafka发送文件二进制以及附属信息 案例 发送方 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord;import java.io.InputStream; import java.nio.charset.S…

Part 4.1 线性动态规划

线性动态规划&#xff0c;即具有线性阶段划分的动态规划。 [USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右…

统计信号处理基础 习题解答10-6

题目 在例10.1中&#xff0c;把数据模型修正为&#xff1a; 其中是WGN&#xff0c;如果&#xff0c;那么方差&#xff0c;如果&#xff0c;那么方差。求PDF 。把它与经典情况PDF 进行比较&#xff0c;在经典的情况下A是确定性的&#xff0c;是WGN&#xff0c;它的方差为&#…