C++队列学习笔记
一、什么是队列?队列与栈有什么区别和联系
像栈一样,队列(queue)也是表。但是与栈后进先出(LIFO)原则不同的是,队列是先进先出(FIFO),队列的基本操作是enqueue(入队),它在表的末端(称为队尾)插入一个元素;dequeue(出队),它是删除(并返回)表的开头(叫做队头)的元素。下图所示一个抽象的队列模型:
同时,与栈类似,队列也可以通过链表和数组实现,由于c++提供了队列容器,本文着重介绍C++容器queue。
二、队列实现
1.queue的常见函数
//包含在有文件#include<queue>中
queue<int> testQueue
testQueue.empty() 如果队列为空返回true,否则返回false
testQueue.size() 返回队列中元素的个数
testQueue.pop() 删除队列首元素但不返回其值
testQueue.front() 返回队首元素的值,但不删除该元素
testQueue.push() 在队尾压入新元素
testQueue.back() 返回队列尾元素的值,但不删除该元素
注:与栈类似
2.实战训练(Leetcode题目练习)
题目:
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。
说明
下述代码默认构造的队列为整型,并且所有插入的元素都为正整数,因此为了好实现相关功能,我初始化的长度为k的队列所有元素都为-1,即初始元素-1代表此处的空间为空,插入值后变为插入后的值,删除一个值则将此处空间的值重新赋值为-1,插入和删除功能只满足队列的FIFO原则。
//用数组实现的队列
//设计一个循环队列
//说明:front为队列的开头,back为队列的末尾
//MyCircularQueue(k): 构造器,设置队列长度为 k 。
//Front: 从队首获取元素。如果队列为空,返回 -1 。
//Rear: 获取队尾元素。如果队列为空,返回 -1 。
//enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
//deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
//isEmpty(): 检查循环队列是否为空。
//isFull(): 检查循环队列是否已满。
class MyCircularQueue {
public:
//构造函数,初始化数据
MyCircularQueue(int k){
theArray.resize(k);
for (int i = 0; i < k; i++)
{
theArray[i] = -1;
}
front = 0;
back = -1;
}
//插入一个数据,插入成功返回ture,否则返回false
bool enQueue(int value) {
if (isFull()) {
return false;
}
else {
if (back != theArray.size() - 1) {
back = back + 1;
theArray[back] = value;
}
else {
back = 0;
theArray[back] = value;
}
}
return true;
}
//删除一个数据,删除成功那么返回ture,否则为false
bool deQueue(){
if (!isEmpty()) {
theArray[front] = -1;
if (front != theArray.size() - 1) {
front = front + 1;
}
else front = 0;
return true;
}
return false;
}
//获取队首元素,若空则返回-1
int Front() {
return theArray[front];
}
//获取队尾元素,若为空则返回-1
int Rear() {
return theArray[back];
}
//判断队列是否为空
bool isEmpty() {
if ((back == -1) || theArray[front] == -1) return true;
else return false;
}
//判断队列是否已经满了
bool isFull() {
if ((back != -1 && back + 1 == front && theArray[back]!= -1 && theArray[front] != -1) || (back == theArray.size() - 1 && front == 0 && theArray[back]!= -1 && theArray[front] != -1))
{
return true;
}
else {
return false;
}
}
private:
vector<int>theArray;
int front;
int back;
};
在leetcode上面的提交结果:
总结
上述队列是通过vector实现的,还可以通过链表定义队列,今天到此为止,明天加油!!