queue 队列也是一个线性存储表,与后进先出的堆栈不同,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出(First In First Out) 表。插入一端称为队尾,删除一端称为队首。
由于C++ STL 的队列泛化,默认使用双端队列 deque 来实现,因此,queue 也可看成一个容器的适配器,将 deque 容器转换为 queue 容器。当然,也可以利用其它合适的序列容器作为底层实现 queue 容器。
queue队列容器的C++标准头文件为 queue ,需要用宏语句 "#include " 包含进来才可应用 queue 容器进行开发。
创建 queue 对象
使用 queue 队列之前,要先利用构造函数创建一个队列对象,才可进行元素的入队、出对、取队首和队尾等操作。
1. queue()
默认的构造函数,创建一个空的 queue 对象。例如,下面一行代码使用默认的双端队列为底层容器创建了一个空的 queue 队列对象 q ,数据元素为 int 类型。
queue q;
2. queue(const queue&)
复制构造函数,用一个 queue 对象创建新的 queue 对象。例如,下面一行代码利用 queue 对象 q1 ,创建一个以双向链表为底层容器的 queue 对象 q2.
// queue > q1;
queue > q2(q1);
元素入队
queue 队列容器的元素入队函数也是 push 函数。由于 C++ STL 的 queue 队列不预设固定的队列大小,因此 push 函数也就不能判断队列控件是否已满,都会试图将元素放入队列,因此 push 函数不会返回元素入队是否成功的信息。
void push(const value_type& x)
元素出对
queue 队列容器的元素出对函数为 pop 函数。函数不判断队列是否为空,都试图将队首元素删除掉。一般先判断队列不为空,才使用该函数进行元素出对操作。
void pop()
取队首、尾元素
queue 队列容器的 front 函数和 back 函数,可分别读取队首和队尾元素。
1. value_type& front() // 读取队列的队首元素
2. value_type& back() // 读取队列的队尾元素
队列非空的判断
从上面看到,很多 queue 队列的操作都要用到 empty 函数,判断不断入队和出对的队列是否为空,再做下一步的处理。
bool empty()
#include#include using namespace std; int main() { // 创建 queue 对象 queue<int> q; // 元素入队 q.push(3); q.push(19); q.push(29); q.push(26); q.push(33); // 元素出对 while (!q.empty()) { // 打印队首元素(取队首) cout << q.front() << ' '; // 删除队首元素 q.pop(); } cout << endl; return 0; }
堆栈是一个线性表,插入和删除只在表的一端进行。这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom)。堆栈的元素插入称为入栈,元素的删除称为出栈。由于元素的入栈和出栈总在栈顶进行,因此,堆栈是一个后进先出(Last In First Out)表,即 LIFO 表。
C++ STL 的堆栈泛化是直接通过现有的序列容器来实现的,默认使用双端队列deque的数据结构,当然,可以采用其他线性结构(vector 或 list等),只要提供堆栈的入栈、出栈、栈顶元素访问和判断是否为空的操作即可。由于堆栈的底层使用的是其他容器,因此,堆栈可看做是一种适配器,将一种容器转换为另一种容器(堆栈容器)。
为了严格遵循堆栈的数据后进先出原则,stack 不提供元素的任何迭代器操作,因此,stack 容器也就不会向外部提供可用的前向或反向迭代器类型。
stack堆栈容器的C++标准头文件为 stack ,必须用宏语句 "#include " 包含进来,才可对 stack 堆栈的程序进行编译。
创建 stack 对象
使用堆栈前,先要利用构造函数进行初始化,创建一个堆栈对象,以进行元素的入栈、出栈等操作。
1. stack()
默认构造函数,创建一个空的 stack 对象。
例如,下面一行代码使用默认的 deque 为底层容器,创建一个空的堆栈对象 s 。
stack s;
2. stack(const stack&)
复制构造函数,用一个 stack 堆栈创建一个新的堆栈。
例如,下面的代码利用 s1 ,创建一个以双向链表为底层容器的空堆栈对象 s2 。
// stack > s1;
stack > s2(s1);
元素入栈
stack堆栈容器的元素入栈函数为 push 函数。由于 C++ STL 的堆栈函数是不预设大小的,因此,入栈函数就不考虑堆栈空间是否为满,均将元素压入堆栈,从而函数没有标明入栈成功与否的返回值。
如下是他的使用原型:
void push(const value_type& x)
元素出栈
stack容器的元素出栈函数为 pop 函数,由于函数并没有判断堆栈是否为空,才进行元素的弹出,因此,需要自行判断堆栈是否为空,才可执行 pop 函数。
void pop()
下面的示例代码,将堆栈的所有元素全部出栈
// stack s;
while(!s.empty())
{
s.pop();// 出栈
}
取栈顶元素
stack容器的栈顶元素的读取函数为 pop 函数,将取出最后入栈的元素,如下是它的使用原型
value_type& top()
堆栈非空判断
随着堆栈元素不断出栈,堆栈可能会出现空的情况,因此,一般需要调用 empty 函数判断是否非空,才作元素出栈和取栈顶元素的操作。
bool empty()
判断堆栈是否为空,返回 true 表示堆栈已空,false 表示堆栈非空