C++ 优先队列

在 C++ 中,STL 的 priority_queue 提供了优先队列数据结构的功能。

优先队列是一种特殊的队列,其中每个元素都与一个优先级值相关联,并且元素根据其优先级进行服务。

In priority queue element with the highest priority is removed first.
优先队列数据结构

要了解有关优先队列的更多信息,请访问我们的 优先队列数据结构


创建优先队列

为了在 C++ 中创建优先队列,我们首先需要包含 queue 头文件。

#include <queue>

导入此文件后,我们可以使用以下语法创建 priority_queue

priority_queue<type> pq;

此处,type 表示我们要存储在优先队列中的数据类型。例如,

// create a priority queue of integer type
priority_queue<int> pq_integer;

// create a priority queue of string type
priority_queue<string> pq_string;

注意: 默认情况下,STL priority_queue 使最大的元素具有最高的优先级。


C++ 优先队列方法

在 C++ 中,priority_queue 类提供了各种方法来对队列执行不同的操作。

方法 描述
push() 将元素插入优先队列
pop() 移除具有最高优先级的元素
top() 返回具有最高优先级的元素
size() 返回元素数量
empty() 如果 priority_queue 为空,则返回 true

将元素插入优先队列

我们使用 push() 方法将元素插入优先队列。例如,

#include<iostream>
#include <queue>
using namespace std;

int main() {

  // create a queue of int
  priority_queue<int> numbers;

// add items to priority_queue numbers.push(1); numbers.push(20); numbers.push(7);
cout << "Priority Queue: "; // display all elements of numbers while(!numbers.empty()) { cout << numbers.top() << ", "; numbers.pop(); } cout << endl; return 0; }

输出

Priority Queue: 20, 7, 1,

在上面的示例中,我们创建了一个名为 numbers 的整数 priority_queue。在这里,我们使用 push() 方法将以下元素插入队列:1207

numbers.push(1);

请注意,我们以随机顺序推送元素,但在打印它们时,我们得到按降序排序的整数:2071

队列的顶部是队列中的最大元素,因为 priority_queue 默认实现为最大堆


打印队列元素

我们无法像遍历向量和其他容器那样遍历优先队列。

这就是为什么我们在上面的程序中使用了 while 循环和各种 priority_queue 方法来打印其元素。

while(!numbers.empty()) {
  cout << numbers.top() << ", ";
  numbers.pop();
}

这是因为 priority_queue 是一个 STL 容器适配器,它提供有限的访问以使其表现得像标准的优先队列数据结构。

因此,我们在循环中重复打印其顶部,然后弹出元素,直到队列为空。

我们将在后面的部分介绍 pop()top()empty()


从优先队列中删除元素

我们可以使用 pop() 方法从 priority_queue 中删除元素。这会删除具有最高优先级的元素。

#include<iostream>
#include <queue>
using namespace std;

// function prototype for display_priority_queue()
void display_priority_queue(priority_queue<int> pq); 

int main() {

  // create a queue of int
  priority_queue<int> numbers;

  // add items to priority_queue
  numbers.push(1);
  numbers.push(20);
  numbers.push(7);
 
  cout << "Initial Priority Queue: ";
  display_priority_queue(numbers);
  
// remove element from queue numbers.pop();
cout << "Final Priority Queue: "; display_priority_queue(numbers); return 0; } // utility function to dislay priority queue void display_priority_queue(priority_queue<int> pq) { while(!pq.empty()) { cout << pq.top() << ", "; pq.pop(); } cout << endl; }

输出

Initial Priority Queue: 20, 7, 1, 
Final Priority Queue: 7, 1, 

在上面的示例中,我们创建了一个名为 numbers 的整数 priority_queue。最初,优先队列的内容是 {20, 7, 1}

然后我们使用 pop() 方法删除顶部元素

// pop the top element
numbers.pop();

这会删除具有最高优先级的元素:20

因此,最终队列包含元素 71。我们使用 display_priority_queue() 函数打印最终队列。


从优先队列中访问元素

我们使用 top() 方法访问 priority_queue 的顶部元素。

#include<iostream>
#include <queue>
using namespace std;

int main() {

  // create a priority queue of int
  priority_queue<int> numbers;

  // add items to priority_queue
  numbers.push(1);
  numbers.push(20);
  numbers.push(7);

// get the element at the top int top = numbers.top();
cout << "Top element: " << top; return 0; }

输出

Top element: 20

在上面的示例中,我们按以下顺序将元素插入 priority_queue1207

然后,我们使用以下方式打印顶部元素

// returns 20
numbers.top();

在这里,20 具有最高的优先级,所以它在顶部。


获取优先队列的大小

我们使用 size() 方法获取 priority_queue 中的元素数量。

#include <iostream>
#include <queue>
using namespace std;

int main() {

  // create a priority queue of string
  priority_queue<string> languages;

  // add items to priority_queue
  languages.push("C++");
  languages.push("Python");
  languages.push("Java");

// get the size of queue int size = languages.size();
cout << "Size of the queue: " << size; return 0; }

输出

Size of the queue: 3

在上面的示例中,我们创建了一个名为 languages 的字符串 priority_queue 并向其中添加了 3 个元素。

然后我们使用 size() 方法查找队列中的元素数量

int size = languages.size();

由于我们将 3 个元素添加到队列中,因此 languages.size() 返回 3


检查优先队列是否为空

我们使用 empty() 方法来检查 priority_queue 是否为空。此方法返回

  • 1 (true) - 如果优先队列为空
  • 0 (false) - 如果优先队列不为空

示例:C++ empty() 方法

#include <iostream>
#include <queue>
using namespace std;

int main() {

  // create a priority queue of ints
  priority_queue<string> languages;

  cout << "Is the queue empty? ";

// check if the queue is empty if (languages.empty()) {
cout << "Yes" << endl; } else { cout << "No" << endl; } cout << "Pushing elements..." << endl; // push element into the queue languages.push("Python"); languages.push("C++"); languages.push("Java"); cout << "Is the queue empty? ";
// check if the queue is empty if (languages.empty()) {
cout << "Yes"; } else { cout << "No"; } return 0; }

输出

Is the queue empty? No
Popping all the elements
Is the queue empty? Yes

在上面的示例中,我们使用 empty() 方法来确定 languages 优先队列是否为空,

if (languages.empty()) {
  cout << "Yes" << endl;
}
else {
  cout << "No" << endl; 
}

最初,队列中没有元素。所以 languages.empty() 返回 true

然后我们向队列中插入元素并再次使用 empty() 方法。这次,它返回 false


最小堆优先队列

我们也可以创建一个最小堆 priority_queue,它按升序排列元素。其语法是

priority_queue<type, vector<type>, greater<type>> pq; 

例如,

// integers are arranged in ascending order
priority_queue<int, vector<int>, greater<int>> pq_integers;

在这种类型的优先队列中,最小的元素具有最高的优先级。


示例:最小堆优先队列

#include<iostream>
#include <queue>
using namespace std;

int main() {

// create a priority queue of int // arranges elements in ascending order priority_queue<int, vector<int>, greater<int>> numbers;
// add items to priority_queue numbers.push(1); numbers.push(20); numbers.push(7); // print element with highest priority cout << "Top element: " << numbers.top(); return 0; }

输出

Top element: 1
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战