队列(queue)

1.队列的概念

队列(queue)是一种线性数据结构,与栈(stack)相反,符合先进先出的规则;

队列有头(queue_head)尾(queue_tail)队列最大长度(Max_queue_length) 3个参数

例如:

第1步中,将1插入队列,此时队列长度为1;

the_queue[++tail] = 1;

第2,3,5,6步与第一步相似;

第4步中,将1弹出队列;

++queue_head;

注意:删除元素不需要真的删除,将queue_head增加1后,要删除的节点就不会再使用(循环队列双端队列在插入到这位时,会直接覆盖)

要查询元素的数量,可以这样:

int queue_length = queue_tail - queue_head + 1;

2.队列的模板

我们可以把队列的操作封装成函数

队列一般有push()pop()size()front()back()几个操作;

#include <bits/stdc++.h>
using namespace std;

#define Max_queue_length 100000 // 队列元素最大数量

typedef int queue_type; // 队列类型

queue_type the_queue[Max_queue_length + 1]; // 队列

int queue_head, queue_tail; // 队列的头和尾

bool push(queue_type x){
    if(queue_tail == Max_queue_length)
        return false; // 操作错误
    the_queue[++queue_tail] = x;
    return true; // 正常完成操作
}

bool pop(){
    if(queue_head > queue_tail)
        return false; // 操作错误
    ++queue_head;
    return true; // 正常完成操作
}

int size(){
    return queue_tail - queue_head + 1;
}

pair<queue_type, bool> interviews(int x){
    if(size() < x || x < 1)
        return make_pair(-1, false); // 操作错误
    return make_pair(the_queue[queue_head + x - 1], true); // 正常完成操作
}
备注:
(1).interviews(int x)函数

此函数包含front()back()函数的功能;

interviews(int x)函数的返回值有两部分,第一部分是访问出的值,第二部分是返回值的合法性,一般是这样写:

queue_type interviews(int x){
    return the_queue[queue_head + x - 1];
}
(2).Max_queue_length

这里的Max_queue_length代表的是队列入队操作最多能有10^5

3.其他的队列

(1) 双端队列

双端队列(deque)其实就是指的队列两端都可以插入或删除;

#include <bits/stdc++.h>
using namespace std;

#define Max_queue_length 100000 // 队列元素最大数量

typedef int queue_type; // 队列类型

queue_type the_queue[Max_queue_length + 1]; // 队列

int queue_head, queue_tail; // 队列的头和尾

bool push_back(queue_type x){
    if(queue_tail == Max_queue_length)
        return false; // 操作错误
    the_queue[++queue_tail] = x;
    return true; // 正常完成操作
}

bool push_front(queue_type x){
    if(queue_head == 1)
        return false; // 操作错误
    the_queue[--queue_head] = x;
    return true; // 正常完成操作
}

bool pop_front(queue_type x){
    if(queue_head > queue_tail)
        return false; // 操作错误
    ++queue_head;
    return true; // 正常完成操作
}

bool pop_back(queue_type x){
    if(queue_head > queue_tail)
        return false; // 操作错误
    --queue_tail;
    return true; // 正常完成操作
}

int size(){
    return queue_tail - queue_head + 1;
}

pair<queue_type, bool> interviews(int x){
    if(size() < x || x < 1)
        return make_pair(-1, false); // 操作错误
    return make_pair(the_queue[queue_head + x - 1], true); // 正常完成操作
}
(2) 循环队列

循环队列只是将队列的两端连起来以节省空间(这里写的是双端循环队列);

#include <bits/stdc++.h>
using namespace std;

#define Max_queue_length 100000 // 队列元素最大数量

typedef int queue_type; // 队列类型

queue_type the_queue[Max_queue_length + 1]; // 队列

int queue_head, queue_tail; // 队列的头和尾

bool push_back(queue_type x){
    if(queue_tail == queue_head - 2 + (queue_head < 2 ? Max_queue_length : 0))
        return false; // 操作错误
    if(queue_tail == Max_queue_length)
        queue_tail = 0;
    the_queue[++queue_tail] = x;
    return true; // 正常完成操作
}

bool push_front(queue_type x){
    if(queue_head == ((queue_tail + 2) > Max_queue_length ? (queue_tail + 2) % Max_queue_length + 1 : queue_tail + 2))
        return false; // 操作错误
    if(queue_head == 0)
        queue_head = Max_queue_length + 1;
    the_queue[--queue_head] = x;
    return true; // 正常完成操作
}

bool pop_front(queue_type x){
    if(queue_head > queue_tail)
        return false; // 操作错误
    if(queue_head == Max_queue_length)
        queue_head = 0;
    ++queue_head;
    return true; // 正常完成操作
}

bool pop_back(queue_type x){
    if(queue_head > queue_tail)
        return false; // 操作错误
    if(queue_tail == 0)
        queue_tail = Max_queue_length;
    --queue_tail;
    return true; // 正常完成操作
}

int size(){
    return (queue_tail >= queue_head ? queue_tail - queue_head + 1 : queue_tail + Max_queue_length - queue_head + 1);
}

pair<queue_type, bool> interviews(int x){
    if(size() < x || x < 1)
        return make_pair(-1, false); // 操作错误
    return make_pair(the_queue[queue_head + x - 1 > Max_queue_length ? (queue_head + x - 1) % Max_queue_length + 1 : queue_head + x - 1], true); // 正常完成操作
}
(3).链式队列

链式队列(list_queue),顾名思义,就是用链表写成的队列,它其实是链表的一种,只是它的功能与队列相似,故为链式队列

具体代码参考链表,此处不另附代码;

4.队列的作用

队列一般用作广度优先搜索(BFS),不同于栈,队列一般都是手写的,没有系统队列

队列有时会与栈一起使用,但不常见;

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值