C++:queue和priority_queue

queue

定义与特性

队列(queue)是一种先进先出(FIFO, First In First Out)的线性表。它只允许在表的一端进行插入操作,而在另一端进行删除操作。队列的插入端称为队尾(rear),删除端称为队首(front)。当队列中没有元素时,称为空队列。

基本操作

  • push(x): 将元素x插入到队尾。
  • front(): 返回队首元素的引用,但不删除它。
  • back(): 返回队尾元素的引用,但通常不用于队列操作,因为队列的设计原则是先进先出。
  • pop(): 移除队首元素,并返回(或不返回)该元素的值。
  • empty(): 检查队列是否为空,如果为空则返回true,否则返回false。
  • size(): 返回队列中元素的个数。

实现方式

队列的实现方式主要有两种:
1.基于顺序表(数组):在这种实现中,队列的尾部可能随着元素的插入而不断移动,导致需要频繁地进行数据搬移。为了避免这种情况,可以使用循环队列来优化。
2.基于链表:链表实现的队列在插入和删除操作时通常具有更好的性能,因为不需要移动元素。

实例

#include <iostream>  
#include <queue> // 包含queue的头文件  
  
int main() {  
    // 创建一个int类型的队列  
    std::queue<int> myQueue;  
  
    // 向队列中添加元素(入队)  
    myQueue.push(10);  
    myQueue.push(20);  
    myQueue.push(30);  
  
    // 查看队列是否为空  
    if (!myQueue.empty()) {  
        std::cout << "队列不为空" << std::endl;  
    }  
  
    // 查看队列的大小  
    std::cout << "队列大小: " << myQueue.size() << std::endl;  
  
    // 查看队首元素(不移除)  
    std::cout << "队首元素: " << myQueue.front() << std::endl;  
  
    // 移除队首元素(并不返回该元素)  
    myQueue.pop();  
  
    // 再次查看队首元素(现在应该是20)  
    std::cout << "移除元素后,新的队首元素: " << myQueue.front() << std::endl;  
  
    // 遍历队列中的所有元素(虽然queue没有直接的遍历方法,但可以通过循环pop和push到另一个容器来实现)  
    std::queue<int> tempQueue;  
    while (!myQueue.empty()) {  
        tempQueue.push(myQueue.front());  
        myQueue.pop();  
        std::cout << "遍历中的元素: " << tempQueue.front() << std::endl;  
        tempQueue.pop(); // 遍历后立即从tempQueue中移除元素,以保持tempQueue为空  
    }  
  
    
  
    return 0;  
}

priority_queue

定义与特性

优先队列(priority_queue)是一种特殊的队列,其中每个元素都被赋予了一个优先级。元素的出队顺序是根据它们的优先级来决定的,而不是它们被插入到队列中的顺序。在默认情况下,最高优先级的元素会被首先移除(即,对于最大堆实现的优先队列,最大的元素会被首先移除)。

基本操作

  • push(x): 将元素x插入到优先队列中。
  • top(): 返回队列中具有最高优先级的元素,但不从队列中移除它。
  • pop(): 移除并返回队列中具有最高优先级的元素。
  • empty(): 检查优先队列是否为空,如果为空则返回true,否则返回false。
  • size(): 返回优先队列中元素的个数。

实现方式

优先队列通常通过堆(heap)来实现,堆是一种特殊的完全二叉树,其中每个父节点的值都大于或等于(或小于或等于,取决于堆的类型)其子节点的值。在C++的STL中,priority_queue默认是一个最大堆。

实例

递增(最大堆)


```c
#include <iostream>  
#include <queue>  
#include <vector>  
  
int main() {  
    // 创建一个int类型的最大堆  
    std::priority_queue<int> maxHeap;  
  
    // 向最大堆中添加元素  
    maxHeap.push(10);  
    maxHeap.push(30);  
    maxHeap.push(20);  
    maxHeap.push(5);  
  
    // 查看并移除最大元素  
    while (!maxHeap.empty()) {  
        std::cout << "最大元素: " << maxHeap.top() << std::endl;  
        maxHeap.pop();  
    }  
  
    // 此时maxHeap为空  
  
    return 0;  
}

递减(最小堆)

使用了std::priority_queue的第三个模板参数来指定一个比较对象。使用了
std::greater,它是一个函数对象,当第一个参数小于第二个参数时返回
true,这与priority_queue期望的比较函数(当第一个参数“大于”第二个参数时返回
true)相反,因此得到堆表现为最小堆。

#include <iostream>  
#include <queue>  
#include <vector>  
#include <functional> // 对于std::greater  
  
int main() {  
    // 使用std::greater<int>创建一个int类型的最小堆  
    std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;  
  
    // 向最小堆中添加元素  
    minHeap.push(10);  
    minHeap.push(30);  
    minHeap.push(20);  
    minHeap.push(5);  
  
    // 查看并移除最小元素  
    while (!minHeap.empty()) {  
        std::cout << "最小元素: " << minHeap.top() << std::endl;  
        minHeap.pop();  
    }  
  
    // 此时minHeap为空  
  
    return 0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值