当前位置:   article > 正文

数据结构——双向队列

双向队列

1.介绍

双端队列,就是两头都可操作即出队和进队的一种数据结构。

个人理解,就是两个队列的操作作用于一个队列的结构。

 假如,把一端的操作给去掉,则双端队列的结构将退化成栈。因此,栈所能做的操作双端队列也是可以的。

2.操作

其实大部分的操作其实和循环队列没什么不同,至少判空和判满函数是相同的。只是对于循环队列多了两个函数出队和入队

只着重介绍和循环队列不同的地方。

对于循环队列,我们用head指向队首元素,tail指向队尾元素后一个位置。那么,对于双端队列的一端我们可以使用上面的指针。

另一端,其实就不需要再另外声明两个变量了,其实(tail-1)%maxSize和(head-1)%maxSize就分别是另一端的首尾指针了。

双端队列对于用链表实现可能更好一点,因为它不需要考虑队满的情况,也不需要考虑循环一些的问题。下面是顺序结构的总的代码。

  1. #pragma once
  2. template<typename T>
  3. class DeQueue
  4. {
  5. T* data;
  6. int head;
  7. int tail;
  8. int maxSize;
  9. void resize();
  10. public:
  11. DeQueue();
  12. ~DeQueue();
  13. bool isFull();
  14. bool isEmpty();
  15. void push1(const T& val);
  16. void push2(const T& val);
  17. bool pop1();
  18. bool pop2();
  19. const T& getFront1();
  20. const T& getFront2();
  21. };
  22. template<typename T>
  23. void DeQueue<T>::resize()
  24. {
  25. T* p = data;
  26. data = new T[maxSize * 2];
  27. //无论是tail>head还是tail<head都把他复制到新的内存,新的内存从0开始
  28. for (int i = head; ((i + maxSize) % maxSize) < tail; i++)
  29. data[i - head] = p[i];
  30. head = 0;
  31. tail = maxSize - 1;
  32. maxSize *= 2;
  33. delete[]p;
  34. }
  35. template<typename T>
  36. DeQueue<T>::DeQueue()
  37. {
  38. data = new T[10];
  39. head = tail = 0;
  40. maxSize = 10;
  41. }
  42. template<typename T>
  43. DeQueue<T>::~DeQueue()
  44. {
  45. delete[]data;
  46. }
  47. template<typename T>
  48. bool DeQueue<T>::isFull()
  49. {
  50. if ((tail + 1) % maxSize == head)
  51. return true;
  52. return false;
  53. }
  54. template<typename T>
  55. bool DeQueue<T>::isEmpty()
  56. {
  57. if (head == tail)
  58. return true;
  59. return false;
  60. }
  61. template<typename T>
  62. void DeQueue<T>::push1(const T& val)
  63. {
  64. if (isFull())
  65. resize();
  66. data[tail] = val;
  67. tail = (tail + 1) % maxSize;
  68. }
  69. template<typename T>
  70. void DeQueue<T>::push2(const T& val)
  71. {
  72. if (isFull())
  73. resize();
  74. head = (head - 1) % maxSize;
  75. data[head] = val;
  76. }
  77. template<typename T>
  78. bool DeQueue<T>::pop1()
  79. {
  80. if (isEmpty())
  81. return false;
  82. head = (head + 1) % maxSize;
  83. return true;
  84. }
  85. template<typename T>
  86. bool DeQueue<T>::pop2()
  87. {
  88. if (isEmpty())
  89. return false;
  90. tail = (tail - 1) % maxSize;
  91. return true;
  92. }
  93. template<typename T>
  94. const T& DeQueue<T>::getFront1()
  95. {
  96. if (isEmpty())
  97. throw("error");
  98. return data[head];
  99. }
  100. template<typename T>
  101. const T& DeQueue<T>::getFront2()
  102. {
  103. if (isEmpty())
  104. throw("error");
  105. return data[((tail-1)%maxSize)];
  106. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/891718
推荐阅读
相关标签
  

闽ICP备14008679号