LeetCode:641. Design Circular Deque设计循环双端队列(C语言)

秒速五厘米 2022-12-31 05:17 224阅读 0赞

题目描述:
设计实现双端队列。
你的实现需要支持以下操作:

  1. MyCircularDeque(k):构造函数,双端队列的大小为k
  2. insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true
  3. insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true
  4. deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true
  5. deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true
  6. getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1
  7. getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1
  8. isEmpty():检查双端队列是否为空。
  9. 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. 所有值的范围为 [1, 1000]
  2. 操作次数的范围为 [1, 1000]
  3. 请不要使用内置的双端队列库。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-circular-deque
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:

  1. typedef struct {
  2. int *arr;
  3. int head;
  4. int tail;
  5. int size;
  6. } MyCircularDeque;
  7. bool myCircularDequeIsFull(MyCircularDeque* obj) ;
  8. bool myCircularDequeIsEmpty(MyCircularDeque* obj) ;
  9. /** Initialize your data structure here. Set the size of the deque to be k. */
  10. MyCircularDeque* myCircularDequeCreate(int k) {
  11. MyCircularDeque *obj = malloc(sizeof(MyCircularDeque) * (k+1));
  12. obj->arr = malloc(sizeof(int) * (k+1));
  13. obj->head = 0;
  14. obj->tail = 0;
  15. obj->size = k + 1;
  16. return obj;
  17. }
  18. /** Adds an item at the front of Deque. Return true if the operation is successful. */
  19. bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) {
  20. if ( myCircularDequeIsFull(obj)) return false;
  21. int pos = (obj->head+obj->size-1) % obj->size;
  22. obj->arr[pos] = value;
  23. obj->head = pos;
  24. return true;
  25. }
  26. /** Adds an item at the rear of Deque. Return true if the operation is successful. */
  27. bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) {
  28. if ( myCircularDequeIsFull(obj)) return false;
  29. obj->arr[obj->tail] = value;
  30. obj->tail = (obj->tail+1) % obj->size;
  31. return true;
  32. }
  33. /** Deletes an item from the front of Deque. Return true if the operation is successful. */
  34. bool myCircularDequeDeleteFront(MyCircularDeque* obj) {
  35. if ( myCircularDequeIsEmpty(obj)) return false;
  36. obj->head = (obj->head+1) % obj->size;
  37. return true;
  38. }
  39. /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
  40. bool myCircularDequeDeleteLast(MyCircularDeque* obj) {
  41. if ( myCircularDequeIsEmpty(obj)) return false;
  42. obj->tail = (obj->tail-1+obj->size) % obj->size;
  43. return true;
  44. }
  45. /** Get the front item from the deque. */
  46. int myCircularDequeGetFront(MyCircularDeque* obj) {
  47. if ( myCircularDequeIsEmpty(obj) ) return -1;
  48. return obj->arr[obj->head];
  49. }
  50. /** Get the last item from the deque. */
  51. int myCircularDequeGetRear(MyCircularDeque* obj) {
  52. if ( myCircularDequeIsEmpty(obj) ) return -1;
  53. int pos = (obj->tail+obj->size-1) % obj->size;
  54. return obj->arr[pos];
  55. }
  56. /** Checks whether the circular deque is empty or not. */
  57. bool myCircularDequeIsEmpty(MyCircularDeque* obj) {
  58. return (obj->head == obj->tail) ? true : false;
  59. }
  60. /** Checks whether the circular deque is full or not. */
  61. bool myCircularDequeIsFull(MyCircularDeque* obj) {
  62. return (obj->head == (obj->tail+1) % obj->size) ? true : false;
  63. }
  64. void myCircularDequeFree(MyCircularDeque* obj) {
  65. free(obj->arr);
  66. free(obj);
  67. return ;
  68. }
  69. /** * 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/

发表评论

表情:
评论列表 (有 0 条评论,224人围观)

还没有评论,来说两句吧...

相关阅读

    相关 队列Deque

    Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque