队列的程序、链式存储构造实现
Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a circle. It is also called "Ring Buffer".
题目作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetb...
题解作者:WildDuck
顺序存储构造的实现形式
struct MyCircularQueue{ int front; int tail; int Max_size; int* data;};typedef struct MyCircularQueue MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* head =(MyCircularQueue*)malloc(sizeof(struct MyCircularQueue)); head->data = (int*)malloc(sizeof(int)*(k+1)); head->front = 0; head->tail = 0; head->Max_size = k+1; return head;}bool myCircularQueueIsEmpty(MyCircularQueue* obj) { if(obj->front == obj->tail) { return true; } else return false;}bool myCircularQueueIsFull(MyCircularQueue* obj) { if((obj->tail+1)%obj->Max_size == obj->front) { return true; } else return false;}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value){ if(myCircularQueueIsFull(obj) == false) { obj->data[obj->tail] = value; obj->tail = (obj->tail+1)%obj->Max_size; return true; } else return false;}bool myCircularQueueDeQueue(MyCircularQueue* obj){ if(myCircularQueueIsEmpty(obj) == false) { obj->data[obj->front] = -1; obj->front = (obj->front+1)%obj->Max_size; return true; } else return false;}int myCircularQueueFront(MyCircularQueue* obj){ if(myCircularQueueIsEmpty(obj) == false) { return obj->data[obj->front]; } else return -1; }int myCircularQueueRear(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj) == false) { if(obj->tail-1 >= 0) { return obj->data[obj->tail-1]; } else return obj->data[obj->Max_size-1]; } else return -1;}void myCircularQueueFree(MyCircularQueue* 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);*/
链式存储构造实现
struct Linklist{ int data; struct Linklist* next;};typedef struct Linklist* Linklist_pointer;typedef struct { int Max_length; int current_length; Linklist_pointer front; Linklist_pointer rear;} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) { if (obj->current_length == 0) { return true; } else return false;}bool myCircularQueueIsFull(MyCircularQueue* obj){ if (obj->current_length == obj->Max_length) { return true; } else return false;}MyCircularQueue* myCircularQueueCreate(int k){ MyCircularQueue* record = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); record->Max_length = k; record->current_length = 0; record->front = NULL; record->rear = NULL; Linklist_pointer head = (Linklist_pointer)malloc(sizeof(struct Linklist)); record->front = head; record->rear = head; return record;}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value){ if(myCircularQueueIsFull(obj) == false) { Linklist_pointer new_elem = (Linklist_pointer)malloc(sizeof(struct Linklist)); new_elem -> data = value; new_elem -> next = NULL; obj->rear->next = new_elem; obj->rear = new_elem; obj->current_length = obj->current_length +1; return true; } return false;}bool myCircularQueueDeQueue(MyCircularQueue* obj){ if(myCircularQueueIsEmpty(obj) == false) { Linklist_pointer temp_pointer = obj->front->next; obj->front->next = obj->front->next->next; obj->current_length = obj->current_length -1; if(myCircularQueueIsEmpty(obj) == true)//删除过后队列为空,须要解决rear指针的指向 { obj->rear = obj->front; } free(temp_pointer); return true; } return false;}int myCircularQueueFront(MyCircularQueue* obj){ if(myCircularQueueIsEmpty(obj) == false) { return obj->front->next->data; } return -1;}int myCircularQueueRear(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj) == false) { return obj->rear->data; } return -1;}void myCircularQueueFree(MyCircularQueue* 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);*/