1. 程式人生 > 其它 >LeetCode:641. Design Circular Deque設計迴圈雙端佇列(C語言)

LeetCode:641. Design Circular Deque設計迴圈雙端佇列(C語言)

技術標籤:LeetCode

題目描述:
設計實現雙端佇列。
你的實現需要支援以下操作:

MyCircularDeque(k):建構函式,雙端佇列的大小為k。
insertFront():將一個元素新增到雙端佇列頭部。 如果操作成功返回 true。
insertLast():將一個元素新增到雙端佇列尾部。如果操作成功返回 true。
deleteFront():從雙端佇列頭部刪除一個元素。 如果操作成功返回 true。
deleteLast():從雙端佇列尾部刪除一個元素。如果操作成功返回 true。
getFront():從雙端佇列頭部獲得一個元素。如果雙端佇列為空,返回 -1。
getRear():獲得雙端佇列的最後一個元素。 如果雙端佇列為空,返回 -1。
isEmpty():檢查雙端佇列是否為空。
isFull():檢查雙端佇列是否滿了。

示例:

MyCircularDeque circularDeque = new MycircularDeque(3); // 設定容量大小為3
circularDeque.insertLast(1); // 返回 true
circularDeque.insertLast(2); // 返回 true
circularDeque.insertFront(3); // 返回 true
circularDeque.insertFront(4); // 已經滿了,返回 false
circularDeque.getRear(); // 返回 2
circularDeque.isFull(); // 返回 true
circularDeque.deleteLast(); // 返回 true

circularDeque.insertFront(4); // 返回 true
circularDeque.getFront(); // 返回 4

提示:

所有值的範圍為 [1, 1000]
操作次數的範圍為 [1, 1000]
請不要使用內建的雙端佇列庫。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/design-circular-deque
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解答:

typedef struct {
	int *arr;
	int head;
	int tail;
	int size;

} MyCircularDeque;
bool myCircularDequeIsFull(MyCircularDeque* obj) ; bool myCircularDequeIsEmpty(MyCircularDeque* obj) ; /** Initialize your data structure here. Set the size of the deque to be k. */ MyCircularDeque* myCircularDequeCreate(int k) { MyCircularDeque *obj = malloc(sizeof(MyCircularDeque) * (k+1)); obj->arr = malloc(sizeof(int) * (k+1)); obj->head = 0; obj->tail = 0; obj->size = k + 1; return obj; } /** Adds an item at the front of Deque. Return true if the operation is successful. */ bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) { if ( myCircularDequeIsFull(obj)) return false; int pos = (obj->head+obj->size-1) % obj->size; obj->arr[pos] = value; obj->head = pos; return true; } /** Adds an item at the rear of Deque. Return true if the operation is successful. */ bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) { if ( myCircularDequeIsFull(obj)) return false; obj->arr[obj->tail] = value; obj->tail = (obj->tail+1) % obj->size; return true; } /** Deletes an item from the front of Deque. Return true if the operation is successful. */ bool myCircularDequeDeleteFront(MyCircularDeque* obj) { if ( myCircularDequeIsEmpty(obj)) return false; obj->head = (obj->head+1) % obj->size; return true; } /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ bool myCircularDequeDeleteLast(MyCircularDeque* obj) { if ( myCircularDequeIsEmpty(obj)) return false; obj->tail = (obj->tail-1+obj->size) % obj->size; return true; } /** Get the front item from the deque. */ int myCircularDequeGetFront(MyCircularDeque* obj) { if ( myCircularDequeIsEmpty(obj) ) return -1; return obj->arr[obj->head]; } /** Get the last item from the deque. */ int myCircularDequeGetRear(MyCircularDeque* obj) { if ( myCircularDequeIsEmpty(obj) ) return -1; int pos = (obj->tail+obj->size-1) % obj->size; return obj->arr[pos]; } /** Checks whether the circular deque is empty or not. */ bool myCircularDequeIsEmpty(MyCircularDeque* obj) { return (obj->head == obj->tail) ? true : false; } /** Checks whether the circular deque is full or not. */ bool myCircularDequeIsFull(MyCircularDeque* obj) { return (obj->head == (obj->tail+1) % obj->size) ? true : false; } void myCircularDequeFree(MyCircularDeque* obj) { free(obj->arr); free(obj); return ; } /** * Your MyCircularDeque struct will be instantiated and called as such: * MyCircularDeque* obj = myCircularDequeCreate(k); * bool param_1 = myCircularDequeInsertFront(obj, value); * bool param_2 = myCircularDequeInsertLast(obj, value); * bool param_3 = myCircularDequeDeleteFront(obj); * bool param_4 = myCircularDequeDeleteLast(obj); * int param_5 = myCircularDequeGetFront(obj); * int param_6 = myCircularDequeGetRear(obj); * bool param_7 = myCircularDequeIsEmpty(obj); * bool param_8 = myCircularDequeIsFull(obj); * myCircularDequeFree(obj); */

執行結果:
在這裡插入圖片描述

Notes:
參考官方文件:https://leetcode-cn.com/problems/design-circular-deque/solution/cyu-yan-shi-xian-40ms-by-xu-zhou-geng/