class MyCircularQueue {
public:
int capcaity
int length
int top
int rear
vector<int>vec
MyCircularQueue(int k) :vec(k){
capcaity=k
length=0
top=0
rear=0
}
bool enQueue(int value) {
if((length+1)>capcaity) return false
length++
rear=rear%capcaity+1
/*rear为队列中最后一个元素下一个元素的索引
rear一直增加肯定会越界,当容器末尾也放了元素,再次入队的时候,索引应该为1
边界条件:
刚开始入队 当队列有第一个元素时 该元素在vec[0],rear就为1
当队列的元素到达容器末尾的时候入队,rear未更新前的值为capcaity-1,入队的更新后为
capcaity,不为0,虽然不符合rear始终为队尾元素下一个元素的索引,但是无关紧要,下次
入队rear就会为1,这里可以理解为capcaity和0两个索引作用是一样的,可能说的不清楚,可
以自己举例子想想*/
vec[rear-1]=value
return true
}
bool deQueue() {
if(length==0) return false
length--
top=(top+1)%capcaity
/*top就是队首元素的索引 要是一直++肯定越界,当到达top到达容器末尾,下一次出队,top应该要返回到0
上式满足*/
return true
}
int Front() {
if(length==0) return -1
return vec[top]
}
int Rear() {
if(length==0) return -1
return vec[rear-1]
}
bool isEmpty() {
if(length==0) return true
else return false
}
bool isFull() {
if(length==capcaity) return true
else return false
}
}