双向队列的简单讲解

参考:https://blog.csdn.net/dengjin20104042056/article/details/54143585
双向队列,顾名思义就是队列二边都可以操作的队列。
双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。双向都可以进行相应的操作。

Constructors创建一个新双向队列
Operators比较和赋值双向队列
assign()设置双向队列的值
at()返回指定的元素
back()返回最后一个元素
begin()返回指向第一个元素的迭代器
clear()删除所有元素
empty()返回真如果双向队列为空
end()返回指向尾部的迭代器
erase()删除一个元素
front()返回第一个元素
get_allocator()返回双向队列的配置器
insert()插入一个元素到双向队列中
max_size()返回双向队列能容纳的最大元素个数
pop_back()删除尾部的元素
pop_front()删除头部的元素
push_back()在尾部加入一个元素
push_front()在头部加入一个元素
rbegin()返回指向尾部的逆向迭代器
rend()返回指向头部的逆向迭代器
resize()改变双向队列的大小
size()返回双向队列中元素的个数
swap()和另一个双向队列交换元素

举个栗子:

双向队列

Description

想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X X表示一个整数,命令代表左边进队操作;
RIN X 表示右边进队操作;
ROUT
LOUT 表示出队操作;

Input

第一行包含一个整数M(M<=10000),表示有M个操作;
以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;

Output

输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;

Sample Input

8
LIN 5
RIN 6
LIN 3
LOUT
ROUT
ROUT
ROUT
LIN 3

Sample Output

3
7 ERROR

AC代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <deque>
#include <algorithm>

using namespace std;
#define MAX 10010
int main()
{
    deque<int>q;  //创建双向队列
    while(!q.empty())//清空双向队列
        q.pop_front();
    int n,a,i,m[MAX]= {0};
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        char s[10];
        scanf(" %s",s);
        if(!strcmp(s,"LIN"))
        {
            scanf("%d",&a);
            q.push_front(a);  //在队列头(左边)存入数据
        }
        else if(!strcmp(s,"RIN"))
        {
            scanf("%d",&a);
            q.push_back(a);//在队列尾(右边)存入数据
        }
        else if(!strcmp(s,"LOUT"))
        {
            if(!q.empty())
                q.pop_front();  //如果队列非空删除队列头(最左边)的数据
            else
                m[i]++;
        }
        else if(!strcmp(s,"ROUT"))
        {
            if(q.empty())
                m[i]++;   
            else
                q.pop_back();
        }
    }
    printf("%d",q.front()); 
    q.pop_front();
    while(!q.empty())
    {
        printf(" %d",q.front());//输出队列中的数据
    q.pop_front();
    }
    printf("\n");
    for(i=1; i<=n; i++)
        if(m[i])
            printf("%d ERROR\n",i);
    return 0;
}
  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis消息队列是一种基于内存的队列,用于在应用程序之间或不同服务之间传输消息。Redis作为一个高性能的内存数据库,可以快速地将消息存储在内存中,并提供了一系列的指令来操作这些消息。在Redis中,消息队列通常使用List数据结构来实现。 以下是Redis消息队列的详细讲解: 1. Redis List数据结构 Redis的List是一个双向链表,可以在列表的两端进行插入和删除操作。在Redis中,List可以用于实现队列、栈等数据结构。List中的每个元素都是一个字符串。 2. Redis消息队列的实现 Redis消息队列的实现通常使用List数据结构,其中List的头部作为队列的入口,尾部作为队列的出口。当有新的消息进入队列时,使用LPUSH指令将消息插入到List的头部,当有消费者需要消费消息时,使用RPOP指令从List的尾部弹出一条消息。 3. 消息队列的生产者和消费者 Redis消息队列有生产者和消费者两个角色。生产者负责向队列中添加消息,消费者则负责从队列中取出消息进行处理。由于Redis是一个高性能的内存数据库,可以快速地将消息存储在内存中,并提供了一系列的指令来操作这些消息,因此Redis消息队列可以高效地实现生产者和消费者之间的消息传递。 4. 消息队列的应用场景 Redis消息队列可以应用于很多场景,比如异步任务处理、实时消息推送、日志处理等。在异步任务处理中,可以将需要异步处理的任务放入队列中,由消费者从队列中取出任务进行处理,从而提高任务处理的效率。在实时消息推送中,可以使用Redis消息队列来实现消息的分发,从而提高消息的实时性和可靠性。在日志处理中,可以将日志信息放入队列中,由消费者从队列中取出日志信息进行处理,从而实现日志的实时处理和分析。 总之,Redis消息队列是一种高效、可靠的消息传递机制,可以应用于各种场景中,是构建分布式系统的重要组件之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值