leetcode622. 设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满
一)循环队列
设计一个循环对列,重点在于在各项操作中维持数据不变式,即维持对象属性之间的正确关系。
(1)构造函数中定义四个属性:
self._len:队列长度
self._elems:用于记录循环队列元素的列表
self._head:队列中第一个元素的下标
self._num:队列中的元素个数
(2)进队列
在队列尾部加入元素,并是self._num加1,以维持对象属性之间的正确关系。
(3)出队列
只是对列中第一个元素下标的指针后移1,同时将self._num减1。
其余操作容易理解,可参看以下代码。
(4)获取队列首元素
若队列为空,即self._num等于0,返回-1;否则,返回索引self._head中的元素
(5)获取队列尾端元素
若对列为空,返回-1;否则,返回索引(self._head + self._num - 1) % self._len中元素,之所以要进行取模操作,是因为该队列为循环对列,存储队列元素的列表最后一个位置的下一个位置为其首位置
(6)队列为空
self._num为0
(7)队列为满
self._num等于self._len
class MyCircularQueue {
public:
/** Initialize your data structure here. Set the size of the queue to be k. */
vector<int> q;
int p_start,num,fullNum;
MyCircularQueue(int k) {
p_start=;
num=;
fullNum=k;
for(int i=;i<k;i++)
q.push_back();
} /** Insert an element into the circular queue. Return true if the operation is successful. */
bool enQueue(int value) {
if(!isFull())
{
q[(num+p_start)%fullNum]=value;
num++;
return true;
}
return false;
} /** Delete an element from the circular queue. Return true if the operation is successful. */
bool deQueue() {
if(isEmpty())
return false;
else
{
p_start=(p_start+)%fullNum;
num--;
return true;
}
} /** Get the front item from the queue. */
int Front() {
if(isEmpty())
return -;
else
return q[p_start];
} /** Get the last item from the queue. */
int Rear() {
if(isEmpty())
return -;
else
{
return q[(num-+p_start)%fullNum];
}
} /** Checks whether the circular queue is empty or not. */
bool isEmpty() {
return num==;
} /** Checks whether the circular queue is full or not. */
bool isFull() {
return num==fullNum;
}
};
以下官方解法,感觉不好理解………………
class MyCircularQueue {
private:
vector<int> data;
int head;
int tail;
int size;
public:
/** Initialize your data structure here. Set the size of the queue to be k. */
MyCircularQueue(int k) {
data.resize(k);
head = -;
tail = -;
size = k;
} /** Insert an element into the circular queue. Return true if the operation is successful. */
bool enQueue(int value) {
if (isFull()) {
return false;
}
if (isEmpty()) {
head = ;
}
tail = (tail + ) % size;
data[tail] = value;
return true;
} /** Delete an element from the circular queue. Return true if the operation is successful. */
bool deQueue() {
if (isEmpty()) {
return false;
}
if (head == tail) {
head = -;
tail = -;
return true;
}
head = (head + ) % size;
return true;
} /** Get the front item from the queue. */
int Front() {
if (isEmpty()) {
return -;
}
return data[head];
} /** Get the last item from the queue. */
int Rear() {
if (isEmpty()) {
return -;
}
return data[tail];
} /** Checks whether the circular queue is empty or not. */
bool isEmpty() {
return head == -;
} /** Checks whether the circular queue is full or not. */
bool isFull() {
return ((tail + ) % size) == head;
}
}; /**
* Your MyCircularQueue object will be instantiated and called as such:
* MyCircularQueue obj = new MyCircularQueue(k);
* bool param_1 = obj.enQueue(value);
* bool param_2 = obj.deQueue();
* int param_3 = obj.Front();
* int param_4 = obj.Rear();
* bool param_5 = obj.isEmpty();
* bool param_6 = obj.isFull();
*/
leetcode622. 设计循环队列的更多相关文章
- [Swift]LeetCode622. 设计循环队列 | Design Circular Queue
Design your implementation of the circular queue. The circular queue is a linear data structure in w ...
- LeetCode 622:设计循环队列 Design Circular Queue
LeetCode 622:设计循环队列 Design Circular Queue 首先来看看队列这种数据结构: 队列:先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素 ...
- Java实现 LeetCode 622 设计循环队列(暴力大法)
622. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器" ...
- Leetcode622.Design Circular Queue设计循环队列
设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列的一个好处是 ...
- 622.设计循环队列 javascript实现
设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为“环形缓冲器”. 循环队列的一个好处是我们可以利用这个队列 ...
- LeetCode 622——设计循环队列
1. 题目 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列 ...
- Java实现 LeetCode 641 设计循环双端队列(暴力)
641. 设计循环双端队列 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头 ...
- Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列
Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
随机推荐
- ItelliJ Idea 2019提交TFVC变更,系统提示Validation must be performed before checking in
问题描述 全新安装的Idea 2019,从Azure DevOps Server 2019 (原名TFS)的TFVC代码库下载文件,正常. 修改代码后,签入,系统提示"Validation ...
- centos 安装python3.7
先安装依赖包: yum -y install bzip2 bzip2-devel ncurses openssl openssl-devel openssl-static xz lzma xz-dev ...
- LeetCode707:设计链表 Design Linked List
爱写bug (ID:iCodeBugs) 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/ ...
- [LeetCode#178]Rank Scores
Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...
- jQuery 源码分析(二) 入口模块
jQuery返回的对象本质上是一个JavaScript对象,而入口模块则可以保存对应的节点的引用,然后供其它模块操作 我们创建jQuery对象时可以给jQuery传递各种不同的选择器,如下: fals ...
- 解决移动端ios下overflow-x scroll无法隐藏滚动条的问题
这次有个需求是在web首页添加分类菜单,一共是8个分类,在移动端水平展示,可以左右滚动. 最后在手机上微信浏览器看到是有个滚动条,非常影响美观. 主要通过以下代码实现水平滚动 white-space: ...
- C++ 在线编译器(支持 C++11)
C++11 的 Inheriting constructors 特性在 GCC 4.8 以前的版本及 VS2013 中都没有支持,测试起来比较麻烦,所以搜集到了几个支持 GCC 4.8 及更高版本的在 ...
- GitFirstRemote
1.$ git ls-remote From git@github.com:Smoothfu/WPFITEMSSOURCEPRODUCTCOLLECTION.git9a6669a2e2c9e22b30 ...
- FPGA最小系统设计
以EP4CE6E22I7为例,设计FPGA最小系统. 程序存储设计 一般使用EPCS4I8N: FPGA_DATA0:13 FPGA_DCLK :12 FPGA_nCS:8 ASDO:6 时钟 待续
- 大话区块链【Blockchain】
最近这几天区块链又粉墨登场了,新闻媒体也一直在大量报道,宣称可能要在金融界掀起一番浪潮.甚至有人说很久之前中国就出现了区块链的产物——麻将.那么区块链到底是什么,麻将和区块链又有什么关系呢? 笔者这两 ...