2022年12月10日 星期六

[622] Design Circular Queue

ㄟ...因為一直被問linked list 的問題,所以這題就用linked list 動態alloc memory 來寫了
但就變成 (1)速度沒有直接一個int array來的快 (2) 動態allocate memory 那就不知道rear 到底要幹嘛了....?! 雖然還是可以每次都把 rear->next 指去head ,但感覺跟題目說的 "前面會有空出來的queue可以使用" 好像不太一樣?___? 因為每次dequeue 都是直接delete 掉head node啊,不
會有空出來的queue 這種東西?! 總而言之XD

反之就是~動態宣告memory 所以memory size 使用上算是小的 ?!

struct Node{
int val;
struct Node *next;
};

typedef struct {
struct Node *head;
struct Node *tail;
int count;
int size;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue *theQ;
theQ= malloc (sizeof (MyCircularQueue));
theQ->count=0;
theQ->size=k;
theQ->head=NULL;
theQ->tail=NULL;
return theQ;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if (obj->count==obj->size)
return false;
struct Node *ptr = malloc(sizeof(struct Node));
if (ptr==NULL)
return false;
ptr->val=value;
ptr->next=NULL;
if (obj->count==0)
{
obj->head = ptr;
obj->tail = ptr;
}
else
{
obj->tail->next=ptr;
obj->tail=ptr;
}
obj->count++;
return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (obj->count==0)
return false;
if (obj->head==NULL)
return false;
struct Node *ptr=obj->head;
obj->head=obj->head->next;
ptr->next=NULL;
free(ptr);
obj->count--;
return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
if (obj->count==0)
return -1;
return (obj->head->val);
}

int myCircularQueueRear(MyCircularQueue* obj) {
if (obj->count==0)
return -1;
return (obj->tail->val);
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if (obj->count==0)
return true;
return false;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
if (obj->count==obj->size)
return true;
return false;
}

void myCircularQueueFree(MyCircularQueue* obj) {
struct Node *ptr=obj->head;
for (int i=0;i<obj->count;i++)
{
struct Node *p2;
p2=ptr->next;
ptr->next=NULL;
free(ptr);
ptr=p2;
}
return;
}

/**
* 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);
*/

沒有留言:

張貼留言