LeetCode | 622. 設計循環隊列
OJ鏈接
思路:
-
我們這里有一個思路:
-
插入數據,bank往后走
- 刪除數據,front往前走
- 再插入數據,就循環了
- 那上面這個方法可行嗎?
怎么判斷滿,怎么判斷空?
這樣是不是比較難
- 我們下面有一個好的方法,就是
多開一個空間
下面是我們的結構體的定義
typedef struct {int* a;int front;int back;int k;
} MyCircularQueue;
初始化
- 這里的初始化就是給a空間開了
k+1
個大小
MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int) * k + 1);obj->front = obj->back = 0;obj->k = k;return obj;
}
判空
- 我們這里先來看判空
- 當我們的頭尾相等了就說明是空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->back;
}
判滿
bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back + 1) % (obj->k + 1) == obj->front;
}
入隊
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj->a[obj->back] = value;obj->back++;obj->back %= (obj->k+1);return true;
}
出隊
bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;obj->front++;obj->front %= (obj->k+1);return true;
}
取隊頭
- 這里很簡單直接取對頭,但是要判斷是否為空,空了就不能取了~~
int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}
取隊尾
int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;//可以這樣寫//if(obj->back == 0)//return obj->a[obj->k];//else//return obj->a[obj->back-1];return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
}
銷毀隊列
void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}
完整的代碼實現
typedef struct {int* a;int front;int back;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int)*(k+1));obj->front = obj->back = 0;obj->k = k;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front == obj->back;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1) == obj->front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj->a[obj->back] = value;obj->back++;obj->back %= (obj->k+1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;++obj->front;obj->front %= (obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->back-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}