leetcode622. 设计循环队列
C语言代码
typedef struct {
int *data;
int front,rear;//队头指针和队尾指针
int n;//队列总长度(可用长度+1)
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->front==obj->rear;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return (obj->rear+1)%obj->n==obj->front;
}
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue *queue=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
queue->data=(int*)malloc(sizeof(int)*(k+1));//循环队列需要牺牲一个空间
queue->front=queue->rear=0;
queue->n=k+1;
return queue;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(myCircularQueueIsFull(obj))
return false;
obj->data[obj->rear]=value;
obj->rear=(obj->rear+1)%obj->n;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
return false;
obj->front=(obj->front+1)%obj->n;
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
return -1;
return obj->data[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj) {
if(myCircularQueueIsEmpty(obj))
return -1;
return obj->data[obj->rear-1<0?obj->rear-1+obj->n:obj->rear-1];
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->data);
free(obj);
}
/**
* Your MyCircularQueue struct will be instantiated and called as such:
* MyCircularQueue* obj = myCircularQueueCreate(k);
* bool param_1 = myCircularQueueEnQueue(obj, value);
* bool param_2 = myCircularQueueDeQueue(obj);
* int param_3 = myCircularQueueFront(obj);
* int param_4 = myCircularQueueRear(obj);
* bool param_5 = myCircularQueueIsEmpty(obj);
* bool param_6 = myCircularQueueIsFull(obj);
* myCircularQueueFree(obj);
*/
C++代码
class MyCircularQueue {
public:
int *data;
int front,rear;//队头指针和队尾指针
int n;//队列总长度(可用长度+1)
MyCircularQueue(int k) {
data=new int[k+1];//循环队列需要牺牲一个空间
front=rear=0;
n=k+1;
}
bool enQueue(int value) {
if(isFull())
return false;
data[rear]=value;
rear=(rear+1)%n;
return true;
}
bool deQueue() {
if(isEmpty())
return false;
front=(front+1)%n;
return true;
}
int Front() {
if(isEmpty())
return -1;
return data[front];
}
int Rear() {
if(isEmpty())
return -1;
return data[rear-1<0?rear-1+n:rear-1];
}
bool isEmpty() {
return front==rear;
}
bool isFull() {
return (rear+1)%n==front;
}
};
/**
* 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();
*/