提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
目前开始有意识地进行学习数据结构的部分,其中线性表是“开篇之作”适合上手又极为重要,本篇作为笔记,将针对queue进行整理,并坚持每隔一定时间,去冗更新。
一、queue是什么
队列是一种特殊的线性表,在队列这种数据结构中,最先插入在元素将是最先被删除;反之最后插入的元素将最后被删除,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列空的条件:front=rear;队列满的条件: rear = MAXSIZE
队列可以进行数组模拟,亦可以采用STL已有的queue容器。
二、queue的操作
1.生成与拷贝
queue 的生成方式和 stack 相同,下面展示如何创建一个保存字符串对象的 queue:
std::queue<std::string> words;
也可以使用拷贝构造函数:
std::queue<std::string> copy_words {words}; // A duplicate of words
2.操作
front() | 返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
back() | 返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
push(const T& obj) | 在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。 |
push(T&& obj) | 以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。 |
pop() | 删除 queue 中的第一个元素。 |
size() | 返回 queue 中元素的个数。 |
empty() | 如果 queue 中没有元素的话,返回 true |
emplace() | 用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。 |
swap(queue<T> &other_q) | 将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。 |
3.遍历
和 stack 一样,queue 也没有迭代器。访问元素的唯一方式是遍历容器内容,并移除访问过的每一个元素。例如:
std::deque<double> values {1.5, 2.5, 3.5, 4.5}; std::queue<double> numbers(values);
while (!numbers, empty())
{
std ::cout << numbers. front() << " "; // Output the 1st element
numbers. pop(); // Delete the 1st element
}
std::cout << std::endl;
用循环列出 numbers 的内容,循环由 empty() 返回的值控制。调用 empty() 可以保证我们能够调用一个空队列的 front() 函数。如代码所示,为了访问 queue 中的全部元素,必须删除它们。如果不想删除容器中的元素,必须将它们复制到另一个容器中。如果一定要这么操作,我们可能需要换一个容器。
4.用途
1、当需要实现广度优先搜索时,可以不用自己手动实现一个队列,而是用queue作为代替,以提高程序的准确性。
2、另外有一点值得注意的是,使用front()和pop()函数前,必须用empty()判断队列是否为空,否则可能因为对空而出现错误。
3、STL容器中还有两种容器跟队列有关,分别是双端队列(deque)和优先队列(priority_queue),前者是首位皆可插入和删除的队列,后者是使用堆实现的默认将当前队列最大元素至于队首的容器。
结语
之后将在学习过程中,不断完善本博客,增添双端队列、优先队列等内容。