queue队列容器


queue队列容器

一、原理

    queue 队列也是一个线性存储表,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出FIFOFirst In First Out)表。插入一端称为队尾,删除一端称为队首。 

    默认使用双端队列deque来实现,queue也可看成一个容器适配器,将 deque 容器转换为 queue 容器。当然,也可以利用其他合适的序列容器作

为底层实现queue容器。

51、queue队列容器 - EdwardLewis - 墨涵天地

C++ STLqueue队列的泛化,是通过模板类型,将默认的deque双端队列类型导入,在内部创建一个序列容器对象,来处理 queue队列的数据存储和操作,包括queue队列是否为空、取队首元素、取队尾元素、元素入队和元素出队等。由于仅需要取队首和队尾元素的操作,因此queue队列容器并不提供任何类型的迭代器。

二、应用

1、创建

1queue() 

    默认的构造函数,创建一个空的 queue 对象。

queue<int> q;//使用默认的双端队列为底层容器创建了一个空的queue队列对象q,数据元素为int类型

2queue(const queue&) 

复制构造函数,用一个queue对象创建新的queue对象。 

//queue<int, list<int> > q1; 

queue<int, list<int> > q2(q1);//以双向链表为底层容器的queue对象

2、入队和出队

void push(const value_type& x) //插入队列

void pop()//出队,从队列中删除

3、取队首尾元素

queue队列容器的front函数和back函数,可分别读取队首和队尾元素。 

1value_type& front() 

读取队列的队首元素。 

2value_type& back() 

读取队列的队尾元素。

4、其它

1bool empty() //判断空

2size_type size() //队列大小

三、例子

#include "iostream"

#include "queue"

using namespace std;

int main()

{

queue<int> q;

q.push(3);

q.push(12);

while(!q.empty()){

cout<<q.front()<<endl;

q.pop();

}

return 1;

}

### 如何遍历 `queue` 队列 对于不同编程语言中的队列,遍历方式有所不同。以下是几种常见的方式。 #### Java 中的 Queue 遍历 Java 提供了多种方法来遍历 `Queue` 接口及其子类的对象。下面展示了一种常见的做法: ```java import java.util.LinkedList; import java.util.Queue; public class Main { public static void main(String[] args) { Queue<String> queue = new LinkedList<>(); queue.offer("First"); queue.offer("Second"); queue.offer("Third"); while (!queue.isEmpty()) { System.out.println(queue.poll()); // 使用poll移除并打印头元素直到队列为空 } } } ``` 另一种更现代的方法是使用增强型for循环或流操作来进行遍历[^5]: ```java import java.util.ArrayDeque; import java.util.Deque; import java.util.stream.StreamSupport; public class StreamExample { public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<>(List.of(1, 2, 3)); // 将deque转换成stream再进行处理 StreamSupport.stream(deque.spliterator(), false).forEach(System.out::println); } } ``` 这里需要注意的是,在某些情况下可能不希望破坏原始队列的内容;此时应考虑复制一份副本用于迭代访问或是采用其他非破坏性的读取手段。 #### C++ STL 中的 queue 遍历 由于C++标准库中的`std::queue`并不支持随机访问其内部存储的数据项,因此要实现遍历通常有两种思路:一是通过不断调用成员函数`front()`获取最前面的一个元素后再配合`pop()`将其弹出从而完成逐一遍历;二是借助辅助容器暂存待处理节点以便后续恢复原状[^1]。 下面是第一种方案的具体实现例子: ```cpp #include <iostream> #include <queue> int main(){ std::queue<int> q; for(int i=0;i<5;++i){ q.push(i*2); // 向队列中加入一些整数作为测试数据 } while(!q.empty()){ int frontElement=q.front(); // 获取当前队首元素 std::cout<<frontElement<<"\n"; q.pop(); // 删除已处理过的队首元素 } return 0; } ``` 第二种情况则适用于那些不允许改变原有队列状态的应用场景下,比如当需要多次重复执行相同模式下的遍历时就可以采取这种方式。 #### Python 中的 queue 模块 Python内置模块`queue`提供了线程安全版本的各种类型的队列对象。为了能够方便地对其进行遍历,一般会结合条件变量或其他同步机制确保多线程环境下的一致性和安全性[^4]。 简单来说就是创建一个新的列表用来保存所有的元素然后再逐一输出它们即可: ```python from queue import Queue def traverse_queue(q): result = [] temp_q = Queue() while not q.empty(): item = q.get() # 取得下一个项目而不删除它 result.append(item) temp_q.put(item) # 把临时队列里的东西放回原来的队列里去保持不变的状态 while not temp_q.empty(): q.put(temp_q.get()) return result if __name__ == '__main__': testQ = Queue() items_to_add=[str(x)+"_item" for x in range(5)] for itm in items_to_add: testQ.put(itm) traversed_items=traverse_queue(testQ) print(traversed_items) ``` 此段代码展示了如何在不影响实际队列内容的前提下对其内含有的各个条目实施遍历动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值