Java描述数据结构之双向队列(Double-ends Queues,Deque)

矫情吗;* 2022-05-25 13:28 523阅读 0赞

双向队列是一种前后两端都可输入或取出数据的有序表,在双向队列中,我们仍然使用两个指针,分别指向加入及取回端,只是加入和取回数据时,各指针所扮演的角色不再是固定的加入或取回,而且两边的指针都向队列中央移动。

下面是实现双向队列的示例程序,可以在两端加入和取出数据:

  1. // 程序名称: DequeTest.java
  2. // 程序目的:输入限制性双向队列
  3. // ===================================================
  4. import java.io.*;
  5. class QueueNode // 队列节点类
  6. {
  7. int data; // 节点数据
  8. QueueNode next; // 指向下一个节点
  9. //构造函数
  10. public QueueNode(int data){
  11. this.data=data;
  12. next=null;
  13. }
  14. }
  15. class Linked_List_Queue { //队列类
  16. public QueueNode front; //队列的前端指针
  17. public QueueNode rear; //队列的尾端指针
  18. //构造函数
  19. public Linked_List_Queue(){
  20. front=null;
  21. rear=null;
  22. }
  23. //方法enqueue:队列数据的存入
  24. public boolean enqueue(int action,int value) {
  25. QueueNode node= new QueueNode(value); //建立节点
  26. if(action==1){
  27. if(rear==null){
  28. front=node;
  29. rear=node;
  30. }else{
  31. node.next=front;
  32. front=node;
  33. }
  34. return true;
  35. }else if(action==2){
  36. if(rear==null){
  37. front=node;
  38. rear=node;
  39. }else{
  40. rear.next=node;
  41. rear=node;
  42. }
  43. return true;
  44. }else{
  45. return false;
  46. }
  47. }
  48. //方法dequeue:队列数据的取出
  49. public int dequeue(int action) {
  50. int value;
  51. QueueNode tempNode,startNode;
  52. //从前端取出数据
  53. if (!(front==null) && action==1) {
  54. if(front==rear){
  55. value=front.data; //将队列数据从前端取出
  56. front=null;
  57. rear=null;
  58. }else{
  59. value=front.data;
  60. front=front.next;
  61. }
  62. return value;
  63. }else if (!(rear==null) && action==2){ //从尾端取出数据
  64. if(front==rear){
  65. value=rear.data;
  66. front=null;
  67. rear=null;
  68. }else{
  69. value=rear.data;
  70. tempNode=front;
  71. while (tempNode.next!=rear){
  72. //tempNode=startNode.next;
  73. tempNode=tempNode.next;
  74. }
  75. rear=tempNode;
  76. }
  77. return value;
  78. }else{
  79. return -1;
  80. }
  81. }
  82. }
  83. public class DequeTest {
  84. // 主程序
  85. public static void main(String args[]) throws IOException {
  86. Linked_List_Queue queue =new Linked_List_Queue(); //建立队列对象
  87. int temp;
  88. System.out.println("以链表来实现双向队列");
  89. System.out.println("====================================");
  90. System.out.println("在双向队列前端加入第1个数据,此数据值为1");
  91. queue.enqueue(1,4);
  92. System.out.println("在双向队列前端加入第2个数据,此数据值为3");
  93. queue.enqueue(1,3);
  94. System.out.println("在双向队列前端加入第3个数据,此数据值为5");
  95. queue.enqueue(2,5);
  96. System.out.println("在双向队列前端加入第4个数据,此数据值为7");
  97. queue.enqueue(1,7);
  98. System.out.println("在双向队列前端加入第5个数据,此数据值为9");
  99. queue.enqueue(2,9);
  100. System.out.println("====================================");
  101. temp=queue.dequeue(1);
  102. System.out.println("从双向队列前端依序取出的元素数据值为:"+temp);
  103. temp=queue.dequeue(2);
  104. System.out.println("从双向队列尾端依序取出的元素数据值为:"+temp);
  105. temp=queue.dequeue(1);
  106. System.out.println("从双向队列前端依序取出的元素数据值为:"+temp);
  107. temp=queue.dequeue(2);
  108. System.out.println("从双向队列尾端依序取出的元素数据值为:"+temp);
  109. temp=queue.dequeue(1);
  110. System.out.println("从双向队列前端依序取出的元素数据值为:"+temp);
  111. System.out.println();
  112. }
  113. }

发表评论

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

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

相关阅读

    相关 java数据结构队列

    队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进

    相关 Java数据结构队列

    基本概念 队列是一种特殊的线性表,其插入操作只能在表的尾部进行,叫入队,这一端被称为队尾,删除操作只能在表的头部进行,叫出队,这一端被称为队首。没有数据元素的队列称为空队