数据结构与算法之数据结构 队列工业级实现 STL queue / 优先队列

数据结构与算法阿木 发布于 10 天前 3 次阅读


摘要:

队列是一种先进先出(FIFO)的数据结构,广泛应用于各种场景,如任务调度、缓冲区管理、广度优先搜索等。本文将围绕数据结构与算法中的队列主题,详细介绍C++标准库中的STL queue以及优先队列的实现原理和应用场景。

一、

队列是一种线性数据结构,它允许在序列的一端插入元素(称为队尾),在另一端删除元素(称为队头)。在计算机科学中,队列广泛应用于各种场景,如操作系统中的任务调度、网络中的缓冲区管理、算法中的广度优先搜索等。

二、STL queue

C++标准库中的STL queue是基于deque(双端队列)实现的,它提供了高效的队列操作。以下是对STL queue的基本操作和实现的详细介绍。

1. STL queue的基本操作

- push:在队列的队尾插入一个元素。

- pop:删除队列的队头元素。

- front:返回队列的队头元素,但不删除它。

- back:返回队列的队尾元素,但不删除它。

- empty:判断队列是否为空。

- size:返回队列中元素的数量。

2. STL queue的实现

STL queue内部使用deque作为底层数据结构,这是因为deque提供了高效的插入和删除操作,适用于队列的FIFO特性。以下是STL queue的简单实现:

cpp

include <iostream>


include <deque>

template <typename T>


class Queue {


private:


std::deque<T> data;

public:


void push(const T& value) {


data.push_back(value);


}

void pop() {


if (!empty()) {


data.pop_front();


}


}

T front() const {


return data.front();


}

T back() const {


return data.back();


}

bool empty() const {


return data.empty();


}

size_t size() const {


return data.size();


}


};

int main() {


Queue<int> q;


q.push(1);


q.push(2);


q.push(3);

std::cout << "Front: " << q.front() << std::endl;


std::cout << "Back: " << q.back() << std::endl;

q.pop();


std::cout << "Front after pop: " << q.front() << std::endl;

return 0;


}


三、优先队列

优先队列是一种特殊的队列,它按照元素的优先级对元素进行排序。在C++中,可以使用STL中的priority_queue来实现优先队列。

1. priority_queue的基本操作

- push:在优先队列中插入一个元素。

- pop:删除优先队列的队头元素,该元素是所有元素中优先级最高的。

- top:返回优先队列的队头元素,但不删除它。

- empty:判断优先队列是否为空。

- size:返回优先队列中元素的数量。

2. priority_queue的实现

STL中的priority_queue是基于二叉堆实现的,它保证了队列的队头元素总是具有最高优先级。以下是priority_queue的简单实现:

cpp

include <iostream>


include <queue>


include <vector>

int main() {


std::priority_queue<int> pq;

pq.push(10);


pq.push(30);


pq.push(20);


pq.push(5);

std::cout << "Top: " << pq.top() << std::endl; // 输出: 30

while (!pq.empty()) {


std::cout << pq.top() << " ";


pq.pop();


}

return 0;


}


3. 优先队列的优先级规则

默认情况下,priority_queue使用最大堆,即优先级最高的元素在队头。如果需要使用最小堆,可以在创建priority_queue时指定比较函数。

cpp

std::priority_queue<int, std::vector<int>, std::greater<int>> pq_min;


四、总结

本文详细介绍了C++标准库中的STL queue和优先队列。STL queue基于deque实现,提供了高效的队列操作;而优先队列基于二叉堆实现,保证了队列的队头元素总是具有最高优先级。在实际应用中,根据具体需求选择合适的队列实现可以大大提高程序的效率和性能。

五、应用场景

1. 任务调度:在操作系统或应用程序中,可以使用队列来管理任务,确保任务按照一定的顺序执行。

2. 缓冲区管理:在数据传输过程中,可以使用队列来存储临时数据,避免数据丢失或冲突。

3. 广度优先搜索:在图论中,可以使用队列来实现广度优先搜索算法,以找到图中的最短路径。

4. 资源分配:在资源分配场景中,可以使用队列来管理资源的分配和回收。

通过本文的学习,读者可以更好地理解队列和优先队列的原理和应用,为实际编程提供有力的支持。