C++队列学习笔记

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实现的,还可以通过链表定义队列,今天到此为止,明天加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值