首页 > 其他分享 >谈谈队列(Queue)

谈谈队列(Queue)

时间:2023-07-08 11:44:26浏览次数:50  
标签:head 队列 tail Queue int 谈谈 MAXN push

写在前面

蒟蒻发第二篇博客了!
作者依然是个新手,依然没有脑子,因此本文可能存在大量不足之处,还请多多指教。对于各种错误,欢迎批评指正!

队列

队列(Queue),是一种数据结构,在STL中可直接调用。具体地来说,队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。这也是其与栈的最大区别。队列的数据呈先进先出,正如排队,“队列”因此得名。

与栈相类似,队列也有pushpop等操作。push是将元素插入队列的过程,称“入队”。

pop则是将队列最前元素删去的过程,称“出队”。

与栈不同的是,队列向外弹出元素时,是从最底端弹出。这一元素通常称front

废话不多说(虽然已经说了很多),直接切入正题

首先,依然是用数组实现:

const int MAXN=105;//演示专用数据  
int queue[MAXN],head=0,tail=0;//head,tail分别表示队列前端(删除端)和后端(插入段) 

随后,是push实现:

void push(int x)
{
    if((tail+1)%MAXN==head)//为防止队列假溢出,使用循环队列。该方法可判断队列是否已满。 
    {
        cout<<"The queue is full!";//输出队列满告警信号 
        return;
    }
    queue[tail]=x;//未满则尾端赋值  
    tail=(tail+1)%MAXN;//实现循环队列   
}

pop的实现过程:

void pop()
{
    if(head==tail)//循环队列下判断栈空  
    {
        cout<<"The queue is empty!";//输出栈空告警  
        return;
    }
    head=(head+1)%MAXN;//头指针加1取余,使之在循环队列中向后挪动一位  
}

front的实现过程:

int front()
{
    if(head==tail)//循环队列下判断栈空 
    {
        cout<<"The queue is empty!"; //输出栈空告警 
        return -1;
    }
    return queue[head];//返回头端值 
}

请注意

  • 队列必须用循环队列,否则可能假溢出!!!

  • 使用循环队列的方法:在headtail变量自增时取余MAXN即可。

  • 判断栈空时,需要判断的是headtail是否相等;而判断栈满时,则要看(tail+1)%MAXNhead的关系

完整代码

//Queue队列  
#include<iostream>
using namespace std;
const int MAXN=5; 
int queue[MAXN],head=0,tail=0;
void push(int x)
{
    if((tail+1)%MAXN==head)
    {
        cout<<"The queue is full!";
        return;
    }
    queue[tail]=x;
    tail=(tail+1)%MAXN;
}
void pop()
{
    if(head==tail)  
    {
        cout<<"The queue is empty!";
        return;
    }
    head=(head+1)%MAXN;  
}
int front()
{
    if(head==tail)
    {
        cout<<"The queue is empty!"; 
        return -1;
    }
    return queue[head];
}
int main()
{
    //进行需要的操作  
    return 0;
 } 

THE END~

标签:head,队列,tail,Queue,int,谈谈,MAXN,push
From: https://www.cnblogs.com/httony/p/17536981.html

相关文章

  • 2023年7月7日,线程池的调用原理,线程池底层,任务队列
    线程池的调用原理线程池的七大参数:核心线程数、最大线程数、任务队列、拒绝策略、闲置时间、时间单位、线程工厂任务进入线程池后线程池的执行顺序:核心线程(用完)---处理完一个任务后会取出任务队列中的第一个任务来执行任务队列(装满)普通线程(用完)拒绝策略深入线程池ExecutorServicep......
  • 消息队列-八股文
    消息队列选型-√kafka:优点:吞吐量高,性能高缺点:功能单一,有丢失消息的风险rocketMQ:优点:功能完善,性能好缺点:客户端仅支持JavaRocketMQ事务消息实现-※RocketMQ底层实现原理-※消息队列如何保证可靠传输可靠传输:不能多不能少1.消费者实现幂等性,哪怕多收消息,......
  • 阿里面试官:谈谈对Redis哈希表的理解
    不少朋友问我,能不能搞个八股文精讲,把面试问题讲讲透,于是系列就这样诞生了。咱们第一期先聊聊Redis。相信哈希表大家并不陌生,今天顺便聊聊Redis的哈希表。Hash表回顾哈希表是一种存储数据的结构,它有很多名字(键值对、字典、符号表、映射、关联数组)。在哈希表中,键和值是一一对应的......
  • BZOJ 1915: [Usaco2010 Open]奶牛的跳格子游戏 单调队列优化dp
    1915:[Usaco2010Open]奶牛的跳格子游戏TimeLimit: 4Sec  MemoryLimit: 64MBSubmit: 281  Solved: 110[Submit][Status][Discuss]Description奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3<=N<=250,000),编号为1..N......
  • python基础 如何查看进程的id号、队列的使用(queue)、解决进程之间隔离关系、生产者消
    如何查看进程id号进程都有几个属性:进程名、进程id号(pid-->processid)每一个进程都有一个唯一的id号,通过这个id号就能找到这个进程importosimporttimedeftask():print("task中的子进程号:",os.getpid())print("主进程中的进程号:",os.getppid())#parent......
  • 为什么要使用消息队列
    为什么要使用消息队列(MQ)?可以列举一些MQ的优点吗?使用消息队列(MQ)有几个主要的优点:解耦:通过使用消息队列,系统之间可以实现解耦。一个系统产生的数据可以通过消息队列发布,其他系统可以订阅该消息并消费,而无需直接与数据产生系统进行交互。这种解耦方式降低了系统之间的依赖性,减少......
  • 延迟队列服务提供对外接口
    延迟队列微服务:redis:list-执行时间<=当前时间   zset-当前时间<执行时间<当前时间+5分钟添加任务:【以防任务数量过大在,一旦服务器挂掉,内存所有的数据都消失了,所以要做数据持久化】添加任务到数据库、符合条件的任务添加到redis【list,zset......
  • 第3章-栈、队列和数组
    3.1栈顺序栈的基本操作#defineMaxSize10typedefstruct{ //栈的顺序存储类型Elemtypedata[MaxSize]; //静态数组存放栈中元素 inttop; //栈顶指针}SqStack;//Sq:sequence--顺序//初始化栈voidInitStack(SqStack&S){S.top=-1; //初始化栈顶指针......
  • 消息队列三兄弟谁主沉浮
    简介消息队列主要为了异步场景下实现上下游解耦功能:在传统场景中,上游产生一条消息,比如用户下单了一件商品,系统创建了对应的订单,需要通知下游的物流、支付等系统进行后续处理;消息队列可以使得上游系统(订单)和下游系统(支付/物流等)解耦,上游只管向消息队列中投递消息即可,下游订阅消息......
  • 单调栈单调队列学习笔记
    目录:单调栈1.1概念1.2实现1.3时间复杂度分析1.4应用单调队列1.1概念1.2实现1.3时间复杂度分析1.4应用习题1.单调栈1.1概念单调栈为满足单调性的栈结构,栈内元素满足单调性。1.2实现为满足单调性,在遍历到一个元素时,若此时加入后栈不满足单调性,则弹出栈......