当前位置: 首页 > news >正文

数据结构-------队列

数据结构-------队列

  • 队列的概念及结构
    • 队列实现
      • 练习

队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

在这里插入图片描述

队列实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数
组头上出数据,效率会比较低。

在这里插入图片描述
与栈类似,可以把声明与定义分开
头文件.h

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType val;
}QNode;typedef struct Queue
{QNode* phead;//头节点指针QNode* ptail;//结尾节点指针int size;
}Queue;
//接口
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);// 队尾插入
void QueuePush(Queue* pq, QDataType x);
// 队头删除
void QueuePop(Queue* pq);// 取队头和队尾的数据
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);

实现文件.c(接口实现)

void QueueInit(Queue* pq)
{pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
void QueueDestroy(Queue* pq)
{assert(pq);assert(pq->phead);if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;pq->size = 0;}
}// 队尾插入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* new = (QNode*)malloc(sizeof(QNode));if (new == NULL){perror("malloc fail");return;}new->next = NULL;new->val = x;if (pq->phead == NULL)//链表为空{pq->phead = pq->ptail = new;pq->size++;}else//有多个节点{pq->ptail->next = new;pq->ptail = new;pq->size++;}
}
// 队头删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->size != 0);if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;pq->size--;}else{Queue* cur = pq->phead->next;free(pq->phead);pq->phead = cur;pq->size--;}
}// 取队头和队尾的数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->size != 0);return pq->phead->val;
}
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->size != 0);return pq->ptail->val;
}int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}

练习

1、用队列实现栈链接: 用队列实现栈链接

首先实现一个队列,然后在构建俩个队列,俩个队列互相导数据

在这里插入图片描述

//队列-----------------------------------------------
typedef struct {Queue q1;Queue q2;} MyStack;MyStack* myStackCreate() {MyStack* p = (MyStack*)malloc(sizeof(MyStack));QueueInit(&p->q1);QueueInit(&p->q2);return p;
}void myStackPush(MyStack* obj, int x)
{if (QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2))//俩个都为空{QueuePush(&(obj->q1), x);}else if (!QueueEmpty(&obj->q1))//向有数据的队列插入数据{QueuePush(&(obj->q1), x);}else{QueuePush(&(obj->q2), x);}
}int myStackPop(MyStack* obj)
{Queue* empty = &obj->q1;Queue* noempty = &obj->q2;if (QueueEmpty(&obj->q2)){empty = &obj->q2;noempty = &obj->q1;}while (QueueSize(noempty) > 1){QueuePush(empty, QueueFront(noempty));QueuePop(noempty);}int ret = QueueFront(noempty);QueuePop(noempty);return ret;
}int myStackTop(MyStack* obj) {if (QueueEmpty(&obj->q2)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);}void myStackFree(MyStack* obj)
{QueueDestroy(&(obj->q2));QueueDestroy(&(obj->q1));free(obj);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Dubbo框架实现RPC远程调用包括nacos的配置和初始化
  • 如何解决 windows11系统 使用中电脑突然自动休眠的问题
  • 使用消息队列、rocketMq实现通信
  • OpenAI 发布 GPT-4o 模型安全评估报告:风险等级为“中等”|TodayAI
  • C++——红黑树(图片+动图详解)
  • TCP Window Full TCP Zero Window
  • 【源码】Sharding-JDBC源码分析之Yaml分片配置文件解析原理
  • 【漏洞修复】Tomcat中间件漏洞
  • 强化学习之REINFORECE策略梯度算法——已CartPole环境为例
  • 高级web安全技术(第一篇)
  • 【ARM】v8架构programmer guide(4)_ARMv8的寄存器
  • Oracle(47)如何创建和使用集合?
  • Leetcode面试经典150题-236.二叉树的最低公共祖先
  • 保研考研机试攻略:第二章——入门经典(2)
  • LVS(Linux virual server)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Android 控件背景颜色处理
  • HashMap ConcurrentHashMap
  • HashMap剖析之内部结构
  • Javascript弹出层-初探
  • JavaScript设计模式之工厂模式
  • JavaScript学习总结——原型
  • Joomla 2.x, 3.x useful code cheatsheet
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • mysql 5.6 原生Online DDL解析
  • nodejs实现webservice问题总结
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React系列之 Redux 架构模式
  • Vue.js-Day01
  • 关于Flux,Vuex,Redux的思考
  • 简单数学运算程序(不定期更新)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 看域名解析域名安全对SEO的影响
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端面试题总结
  • 如何学习JavaEE,项目又该如何做?
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Spring第一个helloWorld
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # Kafka_深入探秘者(2):kafka 生产者
  • #DBA杂记1
  • #HarmonyOS:Web组件的使用
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (不用互三)AI绘画工具应该如何选择
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (排序详解之 堆排序)
  • (三)终结任务
  • (一) storm的集群安装与配置
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .bat文件调用java类的main方法