数据结构与算法-队列
队列是一种常见的数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。队列可以看作是一条排队等待的线性结构,新元素被添加到队列的尾部(rear),而从队列中移除元素则是从队列的头部(front)进行。
队列有两个基本操作:
入队列(push):
出队列(pop):
获取队列头部的元素(peek/front):
获取队列尾部的元素(rear/back):
判断队列是否为空(empty):
获取队列的元素个数(size):
队列可以有多种实现方式:
1. 数组实现:使用数组作为底层数据结构来实现队列。在数组中维护一个指向队列头部和尾部的指针,分别表示队列的起始位置和结束位置。入队操作将元素添加到尾部,出队操作将头部元素移除,并更新头部指针。这种实现方式简单直观,但在动态扩容时可能需要进行数据的搬移,时间复杂度较高。
2. 链表实现:使用链表作为底层数据结构来实现队列。每个节点包含一个元素和指向下一个节点的指针。入队操作将新节点添加到链表尾部,出队操作将头部节点移除,并更新头部指针。这种实现方式不需要进行数据的搬移,动态扩容比较方便,但需要额外的指针操作。
3.双栈实现:使用两个栈 F, S 模拟一个队列,其中 F 是队尾的栈,S 代表队首的栈,支持 push(在队尾插入),pop(在队首弹出)操作,入队列插入到栈 F 中,出队列,如果 S 非空,让 S 弹栈;否则把 F 的元素倒过来压到 S 中(其实就是一个一个弹出插入,做完后是首尾颠倒的),然后再让 S 弹栈。
选择队列的实现方式应根据实际需求和场景来确定,考虑到插入和删除操作的频率、对空间的要求以及是否需要支持动态扩容等因素。
// deque.cpp
// 编译运行
// g++ -g deque.cpp -o deque && ./deque
// 程序输出
// Queue top element: 1
// Queue not empty
// Queue element size: 2
#include <iostream>
#include <queue>
int main()
{
std::queue<int> myQueue;
// 入队操作
myQueue.push(1);
myQueue.push(2);
myQueue.push(3);
// 获取队列头部元素
std::cout << "Queue top element: " << myQueue.front() << std::endl;
// 出队操作
myQueue.pop();
// 判断队列是否为空
if (myQueue.empty())
{
std::cout << "Queue empty" << std::endl;
}
else
{
std::cout << "Queue not empty" << std::endl;
}
// 获取队列大小
std::cout << "Queue element size: " << myQueue.size() << std::endl;
return 0;
}