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 #include3 #include 4 using namespace std; 5 int main() 6 { 7 // 创建 queue 对象 8 queue 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 #include10 #include 11 #include
12 #define QUEUE_SIZE 5013 14 using namespace std;15 int main()16 {17 // 用双向链表作 queue 队列的底层容器18 queue