当前位置:网站首页>LeetCode 622. 设计循环队列
LeetCode 622. 设计循环队列
2022-08-03 19:52:00 【JIeJaitt】
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k)
: 构造器,设置队列长度为 k 。Front
: 从队首获取元素。如果队列为空,返回 -1 。Rear
: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value)
: 向循环队列插入一个元素。如果成功插入则返回真。deQueue()
: 从循环队列中删除一个元素。如果成功删除则返回真。isEmpty()
: 检查循环队列是否为空。isFull()
: 检查循环队列是否已满。
示例:
MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue(2); // 返回 true circularQueue.enQueue(3); // 返回 true circularQueue.enQueue(4); // 返回 false,队列已满 circularQueue.Rear(); // 返回 3 circularQueue.isFull(); // 返回 true circularQueue.deQueue(); // 返回 true circularQueue.enQueue(4); // 返回 true circularQueue.Rear(); // 返回 4
提示:
- 所有的值都在 0 至 1000 的范围内;
- 操作数将在 1 至 1000 的范围内;
- 请不要使用内置的队列库。
class MyCircularQueue {
private:
int front;
int rear;
int capacity;
vector<int> elements;
public:
MyCircularQueue(int k) {
this->capacity = k + 1;
this->elements = vector<int>(capacity);
rear = front = 0;
}
bool enQueue(int value) {
if (isFull()) {
return false;
}
elements[rear] = value;
rear = (rear + 1) % capacity;
return true;
}
bool deQueue() {
if (isEmpty()) {
return false;
}
front = (front + 1) % capacity;
return true;
}
int Front() {
if (isEmpty()) {
return -1;
}
return elements[front];
}
int Rear() {
if (isEmpty()) {
return -1;
}
return elements[(rear - 1 + capacity) % capacity];
}
bool isEmpty() {
return rear == front;
}
bool isFull() {
return ((rear + 1) % capacity) == front;
}
};
type MyCircularQueue struct {
front, rear int
elements []int
}
func Constructor(k int) MyCircularQueue {
return MyCircularQueue{
elements:make([]int,k+1)}
}
func (q *MyCircularQueue) EnQueue(value int) bool {
if q.IsFull() {
return false
}
q.elements[q.rear] = value
q.rear = (q.rear + 1) % len(q.elements)
return true
}
func (q *MyCircularQueue) DeQueue() bool {
if q.IsEmpty() {
return false
}
q.front = (q.front + 1) % len(q.elements)
return true
}
func (q MyCircularQueue) Front() int {
if q.IsEmpty() {
return -1
}
return q.elements[q.front]
}
func (q MyCircularQueue) Rear() int {
if q.IsEmpty() {
return -1
}
return q.elements[(q.rear-1+len(q.elements))%len(q.elements)]
}
func (q MyCircularQueue) IsEmpty() bool {
return q.rear == q.front
}
func (q MyCircularQueue) IsFull() bool {
return (q.rear+1)%len(q.elements) == q.front
}
/** * Your MyCircularQueue object will be instantiated and called as such: * obj := Constructor(k); * param_1 := obj.EnQueue(value); * param_2 := obj.DeQueue(); * param_3 := obj.Front(); * param_4 := obj.Rear(); * param_5 := obj.IsEmpty(); * param_6 := obj.IsFull(); */
边栏推荐
- Matlab paper illustration drawing template No. 42 - bubble matrix diagram (correlation coefficient matrix diagram)
- JWT详解
- 入门3D建模基础教程详细分解
- 简易电子琴设计(c语言)
- ADS 2023 Download Link
- Detailed explanation of JWT
- Benchmarking Lane-changing Decision-making for Deep Reinforcement Learning
- 子树的大小
- MySQL Basics
- pg_memory_barrier_impl in Postgresql and C's volatile
猜你喜欢
随机推荐
入门3D建模基础教程详细分解
利用 rpush 和 blpop 实现 Redis 消息队列
机器学习中专业术语的个人理解与总结(纯小白)
安装anaconda并创建虚拟环境
【飞控开发高级教程6】疯壳·开源编队无人机-AI语音控制
虚拟机vmware设置nat模式上网
子结点的数量(2)
Postgresql source code (64) Query execution - data structure and execution process before submodule Executor (2) execution
C中的数据存储
【微信小程序2】事件传参与数据同步[03]
揭秘5名运维如何轻松管理数亿级流量系统
MySQL基础
【leetcode】剑指 Offer II 007. 数组中和为 0 的三个数(双指针)
从腾讯阿里等大厂出来创业搞 Web3、元宇宙的人在搞什么
不要再用if-else
Network protocol-TCP, UDP difference and TCP three-way handshake, four wave
Benchmarking Lane-changing Decision-making for Deep Reinforcement Learning
数据驱动的软件智能化开发| ChinaOSC
ESP8266-Arduino编程实例-MCP4725数模转换器驱动
边缘盒子+时序数据库,美的数字化平台 iBuilding 背后的技术选型