首页 > 其他分享 >队列

队列

时间:2023-11-27 15:11:05浏览次数:31  
标签:队列 tt int hh push empty

一、算法描述

本篇文章讲述的数据结构是,队列,数组模拟队列,也不是循环队列。

队列的结构,完全就是学校食堂排队打饭的那个队列。一个队头,一个队尾,从队头出,从队尾进,排队打饭也是这样hhh。

//用数组模拟的队列定义如下:
int hh, tt;
int q[N];
/*
	hh表示队头,tt表示队尾(我习惯于表示队尾的下一个位置,可以根据个人习惯来修改)
	q[N]表示队列
*/
  • 队列和栈一样,也不是很难理解的数据结构,重点还是要熟悉应用。

接下来介绍队列的各种操作:

初始化操作:

void init()
{
    hh = tt = 0;
}
  • 看个人习惯,我习惯于 \(tt\) 表示队尾的下一个位置,如果表示队尾则初始化应修改为 \(tt = -1;\)

入队:

void push(int x)
{
    q[tt ++ ] = x;
    //q[++ tt ] =x;
}
  • 队列是在队尾加入元素,所以操作的是 \(tt\) 指针。
  • 以上两种写法的区别就在于,第一种是先存储了 \(x\) ,\(tt\) 再加;而第二种是 \(tt\) 先加再存储 \(x\)。
  • 主要就是个人习惯问题。

出队:

void pop()
{
    hh ++ ;
}
  • 队列出队在队头操作,而且用数组模拟队列也不需要释放这块内存空间,直接让 \(hh\) 指针加一即可。

判空:

bool empty()
{
    return hh == tt;
}
  • 判断队头指针和队尾指针是否相等即可。
  • 另一种情况就是判断 \(hh == tt + 1\) 。

查询队头元素:

int query()
{
    return q[hh];
}
  • 直接返回队头元素即可。

栈和队列的问题都不是很难,主要还是要多应用,熟练掌握这些数据结构。

二、题目描述

实现一个队列,队列初始为空,支持四种操作:

  1. push x – 向队尾插入一个数 \(x\);
  2. pop – 从队头弹出一个数;
  3. empty – 判断队列是否为空;
  4. query – 查询队头元素。

现在要对队列进行 \(M\) 个操作,其中的每个操作 \(3\) 和操作 \(4\) 都要输出相应的结果。

输入格式

第一行包含整数 \(M\),表示操作次数。

接下来 \(M\) 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示队头元素的值。

数据范围

\(1≤M≤100000,\)
\(1≤x≤10^9,\)
所有操作保证合法。

输入样例:

10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6 

输出样例:

NO
6
YES
4 

三、题目来源

AcWing算法基础课-829.模拟队列

四、源代码

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010;

int hh, tt;
int q[N];

void init()
{
    hh = tt = 0;
}

void push(int x)
{
    q[tt ++ ] = x;
}

void pop()
{
    hh ++ ;
}

bool empty()
{
    return hh == tt;
}

int query()
{
    return q[hh];
}

int main()
{
    int m;
    cin >> m;
    
    init();
    
    while (m -- )
    {
        char s[10];
        cin >> s;
        
        int x;
        
        if (!strcmp(s, "push"))
        {
            cin >> x;
            push(x);
        }
        else if (!strcmp(s, "pop"))
        {
            pop();   
        }
        else if (!strcmp(s, "empty"))
        {
            if (empty())    puts("YES");
            else    puts("NO");
        }
        else
        {
            cout << query() << endl;
        }
    }
    
    return 0;
}

标签:队列,tt,int,hh,push,empty
From: https://www.cnblogs.com/grave-master/p/17859294.html

相关文章

  • 队列(最基本队列,标准队列 2个,双端队列,单调队列)
    2023-11-26最基本队列:一次性使用的classQueue01{//最基本队列,一次性的,数组模拟,先进先出//功能:入队,出队,判满,判空,显示队头,显示队列privateint[]queue;privateintfront=-1;//指向第一个元素前一个位置privateinttail=-1;//指向最后一个元素p......
  • 堆和优先队列(洛谷P3378)
    1.优先队列解决:优先队列:头文件和定义:#include<queue>template<classT,classContainer=vector<T>,classCompare=less<typenameContainer::value_type>>classpriority_queue;可表达为以下形式:priority_queue<Type,Container,Functional>type:即数据的类型Co......
  • BlockingQueue阻塞队列
    BlockingQueue阻塞队列BlockingQueue简介juc包下,BlockingQueue很好的解决了多线程中,高效安全的"传输数据"问题。阻塞队列,是一个队列,可以是数据从队列的一端输入,从另一端输出。当队列空时,从队列获取元素线程被阻塞,直到其他线程向空的队列插入新元素。当队列满时,向队列添加元......
  • 数据结构之优先队列(java)
    一:概述队列的特点是:先进先出(FIFO).入队列,将元素置于队尾;出队列,队头元素最先被移出:优先队列不遵循先入先出的原则,而是分两种情况。最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队。例如有一个最大优先队列,其中的......
  • 万字长文:从 C# 入门学会 RabbitMQ 消息队列编程
    RabbitMQ教程 目录RabbitMQ教程RabbitMQ简介安装与配置安装RabbitMQ发布与订阅模型生产者、消费者、交换器、队列多工作队列交换器类型DirectFanoutTopic交换器绑定交换器消费者、消息属性Qos、拒绝接收消息确认模式消息持久化消息TTL时......
  • 7-2 队列应用(蓝桥杯)
    importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner; publicclassMain{    publicstaticvoidmain(String[]args){        Scannersc=newScanner(System.in);        Queue<String>vip=newLinkedList<>();......
  • RabbitMQ -- 延迟队列(死信队列中的消息TTL过期)
    用来存放需要在指定时间被处理的元素队列,队列中的元素希望在指定时间被取出和处理使用场景:订单在十分钟内未支付自动取消新创建的店铺,如果在十天之内没有上传过商品,则自定发送消息提醒用户注册成功后,如果三天内没有登录则进行短信提醒用户发起退款后,如果三天内没有得到处理则通知相......
  • Odoo16_queue_job第三方异步队列
    1.安装第三方模块queue_jobqueue/queue_jobat16.0·OCA/queue·GitHub2.odoo配置文件,启动多workersworkers=3proxy_mode=Trueserver_wide_modules=web,queue_job[queue_job]channels=root:23.使用方法fromodooimportmodels,fields,apiclass......
  • 队列存放用户请求,执行耗时操作的解决方案
    队列存放用户请求的实现方案直接上图待补充……......
  • 队列和循环队列(ArrayQueueAndCircleQueue)
    队列数组队列1.初始化队列privateintmaxsize;//最大长度privateintfront;//指向队首的前一个位置privateintrear;//指向队尾privateint[]arr;publicArrayQueue(intmaxsize){this.maxsize=maxsize;arr=newint[maxsize];......