STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)

1.FIFO队列

    std::queue就是普通意思上的FIFO队列在STL中的模版。

  1.1主要的方法有:

    (1)T front():访问队列的对头元素,并不删除对头元素

    (2)T back():访问队列的末尾元素,并不删除末尾元素

    (3)void pop():删除对头元素。

    (4)void push(T):元素入队

  1.2代码实例  

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int main()
 5 {
 6     std::queue<int> myqueue;
 7     myqueue.push(11);   //入队
 8      myqueue.push(22);
 9     myqueue.push(33);
10
11     cout<<"队列末尾元素:"<<myqueue.back()<<endl;
12     cout<<"队列元素出队顺序如下:";
13     while(!myqueue.empty()) //判空
14     {
15         cout<<myqueue.front()<<"  ";    //访问队列头元素
16         myqueue.pop();  //队列头元素出对
17     }
18     return 0;
19 }

View Code

  程序输出:

2.优先队列

   std::priority_queue就是优先级队列在STL中的模版,在优先队列中,优先级高的元素先出队列,内部使用堆实现(大顶堆,同Top K问题)。

  2.1 模版原型:priority_queue<T,Sequence,Compare>

    T:存放容器的元素类型

    Sequence:实现优先级队列的底层容器,默认是vector<T>

    Compare:用于实现优先级的比较函数,默认是functional中的less<T>

  2.2主要对方法有:  

     (1)T top():访问队列的对头元素,并不删除对头元素

     (2)void pop():删除对头元素。

     (3)void push(T):元素入队

  2.3使用默认参数的优先队列实例

 1 #include <iostream>
 2 #include <queue>
 3 int main()
 4 {
 5   std::priority_queue<int> mypq;
 6   mypq.push(30);    //入队
 7   mypq.push(100);
 8   mypq.push(25);
 9   mypq.push(40);
10   std::cout << "Popping out elements...";
11   while (!mypq.empty())
12   {
13      std::cout << ' ' << mypq.top();    //读取队列头元素
14      mypq.pop();   //对头元素出队列
15   }
16   std::cout << '\n';
17   return 0;
18 }

View Code

  程序输出:

  2.4使用自定义的比较函数的优先队列实例

  标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,大的优先级高,优先输出。我们只要重写<操作符就可以啦(可以像C语言的qsort()一样,可以写比较复杂的比较函数)。

  下面的实例中,重写<操作符,使得数字小的数,优先级大。

 1 #include <iostream>
 2 #include <queue>
 3 #include <vector>
 4 #include <functional>
 5 using namespace std;
 6 struct Node
 7 {
 8     int f;
 9     bool operator<(const Node& node)const
10     {
11         return f<node.f? false :true ;  //小的数字,可以让它不小
12     }
13 };
14 class cmp
15 {
16     public:
17     bool operator()( const Node & n1, const Node & n2) const
18     {
19         return n1<n2;   //Node类已经重写了<运算符
20     }
21 };
22 int main()
23 {
24     priority_queue< Node,vector<Node>,cmp > q;
25     Node n1,n2,n3,n4;
26
27     n1.f = 5; n2.f = 4;
28     n3.f = 2; n4.f = 10;
29
30     q.push(n1); q.push(n2);
31     q.push(n3); q.push(n4);
32     while(!q.empty())
33     {
34         cout<< q.top().f<<" ";
35         q.pop();
36     }
37 }

View Code

 程序输出:

3.双端队列

   双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。deque是STL中双端队列模版。

3.1主要对方法有:  

     (1)void pop_front():从队列头部删除元素

     (2)void pop_back():从队列删除元素

     (3)void push_front(T):从队列头部插入元素    

         (4)void push_back(T):从队列尾部插入元素

     (5)T front():读取队列头部元素    

         (6)T back(T):读取队列尾部元素

   3.2代码实例

 1 #include <iostream>
 2 #include <deque>
 3
 4 int main ()
 5 {
 6   std::deque<int> mydeque;
 7   mydeque.push_back (1);    //队列尾部插入
 8   mydeque.push_back (2);
 9   mydeque.push_back (3);
10   mydeque.push_front(4);    //队列头部插入
11
12   std::cout << "Popping out the elements in mydeque:";
13   while (!mydeque.empty())
14   {
15     std::cout << ' ' << mydeque.front();
16     mydeque.pop_front();    //删除队列头部
17   }
18   std::cout << "\nThe final size of mydeque is " << int(mydeque.size()) << '\n';
19   return 0;
20 }

View Code

  程序输出:

时间: 2024-10-07 04:24:06

STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)的相关文章

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

经典算法题每日演练——第十九题 双端队列

     话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in love,嗨,慢慢调整心态吧, 这篇就选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念      我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在 队列两端进行插入或者删除操作. 二:编码

双端队列算法练习题

话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就 一直忙着Fall in love,嗨,慢慢调整心态吧,这篇就选一个简单的数据结构聊一聊,话说有很多数据 结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是栈和队列 的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈 是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在队列两端进行插入或者删 除操作. 二:编码 1:定义结构体

详解Python的collections模块中的deque双端队列结构_python

deque 是 double-ended queue的缩写,类似于 list,不过提供了在两端插入和删除的操作. appendleft 在列表左侧插入 popleft 弹出列表左侧的值 extendleft 在左侧扩展 例如: queue = deque() # append values to wait for processing queue.appendleft("first") queue.appendleft("second") queue.appendl

Python实现的数据结构与算法之双端队列详解_python

本文实例讲述了Python实现的数据结构与算法之双端队列.分享给大家供大家参考.具体分析如下: 一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样. 二.ADT 双端队列ADT(抽象数据类型)一般提供以下接口: ① Deque() 创建双端队列 ② addFront(item) 向队首插入项 ③ addRe

lintcode 滑动窗口的最大值(双端队列)

题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# v滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值. v样例 给出数组 [1,2,7,7,8], 滑动窗口大小为 k = 3. 返回 [7,7,8]. 解释: 最开始,窗口的状态如下: [|1, 2 ,7| ,7 , 8], 最大值为 7; 然后窗口向右移动一位: [1,

lintcode二叉树的锯齿形层次遍历 (双端队列)

v题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ v二叉树的锯齿形层次遍历  给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)  v样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7 返回其锯齿形的层次遍历为: [ [3], [20,9], [15,7] ] v思路: 我们用双端

Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出_Lua

a={} for i=1,10 do a[i]={} for j=0,10 do if(i%2==0) then a[i][j]=0 end end end print(a[9][10]) print(a[10][10]) print() --双端队列 List={} function List.new() return {first = 0,last = -1} end function List.pushleft(list,value) local first= list.first-1 l

数据结构-队列与双端队列(C描述)

1.使用数组实现队列 queue.h typedef int ElementType; #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED struct QueueRecord; typedef struct QueueRecord *Queue; int IsEmpty(Queue Q); int IsFull(Queue Q); Queue CreateQueue(int MaxElements); void DisposeQueue(Queu