题目
641. 设计循环双端队列 - 力扣(LeetCode)
Python
class MyCircularDeque:
"""
使用固定长度的栈来和头指针front,尾指针rear来实现,
注意rear并不是指着队列的最后一个,而是指着最后一个的下一个。
还有就是,front+-1,rear+-1必须有取余操作
"""
def __init__(self, k: int):
self.front=self.rear=0
# 有一块空间仅用来判断队满,不用来存值
self.qu=[0]*(k+1)
self.le=k+1
def insertFront(self, value: int) -> bool:
if self.isFull():
return False
self.front=(self.front-1)%self.le
self.qu[self.front]=value
return True
def insertLast(self, value: int) -> bool:
if self.isFull():
return False
self.qu[self.rear]=value
self.rear=(self.rear+1)%self.le
return True
def deleteFront(self) -> bool:
if self.isEmpty():
return False
self.front=(self.front+1)%self.le
return True
def deleteLast(self) -> bool:
if self.isEmpty():
return False
self.rear=(self.rear-1)%self.le
return True
def getFront(self) -> int:
return -1 if self.isEmpty() else self.qu[self.front]
def getRear(self) -> int:
return -1 if self.isEmpty() else self.qu[(self.rear-1)%self.le]
def isEmpty(self) -> bool:
return self.front==self.rear
def isFull(self) -> bool:
return (self.rear+1)%self.le ==self.front
C++
class MyCircularDeque {
public:
vector<int> qu;
int le;
int front;
int rear;
MyCircularDeque(int k)
{
le=k+1;
while(k-- >-1) qu.emplace_back(0);
front=0;
rear=0;
}
bool insertFront(int value)
{
if(isFull()) return false;
front=(front-1+le)%le;
qu[front]=value;
return true;
}
bool insertLast(int value)
{
if(isFull()) return false;
qu[rear]=value;
rear=(rear+1)%le;
return true;
}
bool deleteFront()
{
if(isEmpty()) return false;
front=(front+1)%le;
return true;
}
bool deleteLast()
{
if(isEmpty()) return false;
rear=(rear-1+le)%le;
return true;
}
int getFront()
{
return isEmpty()?-1:qu[front];
}
int getRear()
{
return isEmpty()?-1:qu[(rear-1+le)%le];
}
bool isEmpty()
{
return front==rear;
}
bool isFull()
{
return (rear+1)%le==front;
}
};
C语言