queue 队列容器

queue 队列容器

    queue 队列也是一个线性存储表,与后进先出的堆栈不同,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出(First In First Out) 表。插入一端称为队尾,删除一端称为队首。
    由于C++ STL 的队列泛化,默认使用双端队列 deque 来实现,因此,queue 也可看成一个容器的适配器,将 deque 容器转换为 queue 容器。当然,也可以利用其它合适的序列容器作为底层实现 queue 容器。
    queue队列容器的C++标准头文件为 queue ,需要用宏语句 "#include <queue>" 包含进来才可应用 queue 容器进行开发。


创建 queue 对象
使用 queue 队列之前,要先利用构造函数创建一个队列对象,才可进行元素的入队、出对、取队首和队尾等操作。
1.    queue()
    默认的构造函数,创建一个空的 queue 对象。例如,下面一行代码使用默认的双端队列为底层容器创建了一个空的 queue 队列对象 q ,数据元素为 int 类型。
    queue<int>  q;
    
2.    queue(const queue&)
    复制构造函数,用一个 queue 对象创建新的 queue 对象。例如,下面一行代码利用 queue 对象 q1 ,创建一个以双向链表为底层容器的 queue 对象 q2.
    // queue<int, list<int> >    q1;
    queue<int, list<int> >    q2(q1);
    
元素入队
    queue 队列容器的元素入队函数也是 push 函数。由于 C++ STL 的 queue 队列不预设固定的队列大小,因此 push 函数也就不能判断队列控件是否已满,都会试图将元素放入队列,因此 push 函数不会返回元素入队是否成功的信息。
        void  push(const value_type& x)
    
元素出对
    queue 队列容器的元素出对函数为 pop 函数。函数不判断队列是否为空,都试图将队首元素删除掉。一般先判断队列不为空,才使用该函数进行元素出对操作。
    void  pop()
    
取队首、尾元素
    queue 队列容器的 front 函数和 back 函数,可分别读取队首和队尾元素。
1.    value_type&  front()    // 读取队列的队首元素
2.    value_type&  back()    // 读取队列的队尾元素

队列非空的判断
    从上面看到,很多 queue 队列的操作都要用到 empty 函数,判断不断入队和出对的队列是否为空,再做下一步的处理。
    bool  empty()

复制代码
 1 ----------------------------------------- 获取 queue 队列的所有元素
 2 #include <queue>
 3 #include <iostream>
 4 using namespace std;
 5 int main()
 6 {
 7     // 创建 queue 对象
 8     queue<int> q;
 9     // 元素入队
10     q.push(3);
11     q.push(19);
12     q.push(29);
13     q.push(26);
14     q.push(33);
15     // 元素出对
16     while (!q.empty())
17     {
18         // 打印队首元素(取队首)
19         cout << q.front() << '    ';
20         // 删除队首元素
21         q.pop();
22     }
23 
24     cout << endl;
25 
26     return 0;
27 }
复制代码

 

 

复制代码
 1 /*    队列的大小
 2     队列的元素个数可用 size 函数获取。如果每次元素入队前,都先检查当前队列的元素个数,以此判断是否再允许元素入队,那么就可实现一个具有固定长队的队列。如下是 size 函数的使用原型:
 3     size_type  size()
 4     
 5     下面的示例程序,将 queue 队列的长队设置为 50 个 int 元素,并使用 list 双向链表作底层结构,每当元素入队时,都调用 size 函数检查长度是否会超过限定的长度界限,实现一个固定大小的 queue 队列。
 6 */
 7 
 8 ----------------------------------------- 固定长度的 queue 队列
 9 #include <queue>
10 #include <list>
11 #include <iostream>
12 #define QUEUE_SIZE  50
13 
14 using namespace std;
15 int main()
16 {
17     // 用双向链表作 queue 队列的底层容器
18     queue<int, list<int> >   q;
19     if (q.size() < QUEUE_SIZE)
20         q.push(51);
21     if (q.size() < QUEUE_SIZE)
22         q.push(36);
23     if (q.size() < QUEUE_SIZE)
24         q.push(28);
25     if (q.size() < QUEUE_SIZE)
26         q.push(1);
27     // 元素出对
28     while (!q.empty())
29     {
30         // 打印 51  36  28  1
31         cout << q.front() << "  ";
32         // 出对
33         q.pop();
34     }
35 
36     cout << endl;
37 
38     return 0;
39 }
复制代码

 

 


-------------------------- queue 小结
    队列也是一种常用的数据结构,通常以消息队列的形式应用与进程间的通信。C++ STL 提供的 queue 容器队列的数据结构和受限操作进行了泛化封装,包括队列初始化、元素入队、取队首元素、元素出对、队列是否为空以及获取当前队列长度等操作。
    与堆栈一样,queue 队列也是默认使用 queue 双端队列作底层架构,元素的出对也不返回队首元素,需要先用取队首函数将之读出。通过检查当前队列长度,来决定是否允许元素入队,可实现具有固定长度的队列。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值