java 实现数据结构之队列

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作。
1.队列的顺序存储结构及实现
Java代码 收藏代码
  1. publicclassSequenceQueue<T>
  2. {
  3. privateintDEFAULT_SIZE=10;
  4. //保存数组的长度。
  5. privateintcapacity;
  6. //定义一个数组用于保存顺序队列的元素
  7. privateObject[]elementData;
  8. //保存顺序队列中元素的当前个数
  9. privateintfront=0;
  10. privateintrear=0;
  11. //以默认数组长度创建空顺序队列
  12. publicSequenceQueue()
  13. {
  14. capacity=DEFAULT_SIZE;
  15. elementData=newObject[capacity];
  16. }
  17. //以一个初始化元素来创建顺序队列
  18. publicSequenceQueue(Telement)
  19. {
  20. this();
  21. elementData[0]=element;
  22. rear++;
  23. }
  24. /**
  25. *以指定长度的数组来创建顺序队列
  26. *@paramelement指定顺序队列中第一个元素
  27. *@paraminitSize指定顺序队列底层数组的长度
  28. */
  29. publicSequenceQueue(Telement,intinitSize)
  30. {
  31. this.capacity=initSize;
  32. elementData=newObject[capacity];
  33. elementData[0]=element;
  34. rear++;
  35. }
  36. //获取顺序队列的大小
  37. publicintlength()
  38. {
  39. returnrear-front;
  40. }
  41. //插入队列
  42. publicvoidadd(Telement)
  43. {
  44. if(rear>capacity-1)
  45. {
  46. thrownewIndexOutOfBoundsException("队列已满的异常");
  47. }
  48. elementData[rear++]=element;
  49. }
  50. //移除队列
  51. publicTremove()
  52. {
  53. if(empty())
  54. {
  55. thrownewIndexOutOfBoundsException("空队列异常");
  56. }
  57. //保留队列的rear端的元素的值
  58. ToldValue=(T)elementData[front];
  59. //释放队列的rear端的元素
  60. elementData[front++]=null;
  61. returnoldValue;
  62. }
  63. //返回队列顶元素,但不删除队列顶元素
  64. publicTelement()
  65. {
  66. if(empty())
  67. {
  68. thrownewIndexOutOfBoundsException("空队列异常");
  69. }
  70. return(T)elementData[front];
  71. }
  72. //判断顺序队列是否为空队列
  73. publicbooleanempty()
  74. {
  75. returnrear==front;
  76. }
  77. //清空顺序队列
  78. publicvoidclear()
  79. {
  80. //将底层数组所有元素赋为null
  81. Arrays.fill(elementData,null);
  82. front=0;
  83. rear=0;
  84. }
  85. publicStringtoString()
  86. {
  87. if(empty())
  88. {
  89. return"[]";
  90. }
  91. else
  92. {
  93. StringBuildersb=newStringBuilder("[");
  94. for(inti=front;i<rear;i++)
  95. {
  96. sb.append(elementData[i].toString()+",");
  97. }
  98. intlen=sb.length();
  99. returnsb.delete(len-2,len).append("]").toString();
  100. }
  101. }
  102. }

2.循环队列(顺序结构存储实现)

Java代码 收藏代码
  1. importjava.util.Arrays;
  2. publicclassLoopQueue<T>
  3. {
  4. privateintDEFAULT_SIZE=10;
  5. //保存数组的长度。
  6. privateintcapacity;
  7. //定义一个数组用于保存循环队列的元素
  8. privateObject[]elementData;
  9. //保存循环队列中元素的当前个数
  10. privateintfront=0;
  11. privateintrear=0;
  12. //以默认数组长度创建空循环队列
  13. publicLoopQueue()
  14. {
  15. capacity=DEFAULT_SIZE;
  16. elementData=newObject[capacity];
  17. }
  18. //以一个初始化元素来创建循环队列
  19. publicLoopQueue(Telement)
  20. {
  21. this();
  22. elementData[0]=element;
  23. rear++;
  24. }
  25. /**
  26. *以指定长度的数组来创建循环队列
  27. *@paramelement指定循环队列中第一个元素
  28. *@paraminitSize指定循环队列底层数组的长度
  29. */
  30. publicLoopQueue(Telement,intinitSize)
  31. {
  32. this.capacity=initSize;
  33. elementData=newObject[capacity];
  34. elementData[0]=element;
  35. rear++;
  36. }
  37. //获取循环队列的大小
  38. publicintlength()
  39. {
  40. if(empty())
  41. {
  42. return0;
  43. }
  44. returnrear>front?rear-front
  45. :capacity-(front-rear);
  46. }
  47. //插入队列
  48. publicvoidadd(Telement)
  49. {
  50. if(rear==front
  51. &&elementData[front]!=null)
  52. {
  53. thrownewIndexOutOfBoundsException("队列已满的异常");
  54. }
  55. elementData[rear++]=element;
  56. //如果rear已经到头,那就转头
  57. rear=rear==capacity?0:rear;
  58. }
  59. //移除队列
  60. publicTremove()
  61. {
  62. if(empty())
  63. {
  64. thrownewIndexOutOfBoundsException("空队列异常");
  65. }
  66. //保留队列的rear端的元素的值
  67. ToldValue=(T)elementData[front];
  68. //释放队列的rear端的元素
  69. elementData[front++]=null;
  70. //如果front已经到头,那就转头
  71. front=front==capacity?0:front;
  72. returnoldValue;
  73. }
  74. //返回队列顶元素,但不删除队列顶元素
  75. publicTelement()
  76. {
  77. if(empty())
  78. {
  79. thrownewIndexOutOfBoundsException("空队列异常");
  80. }
  81. return(T)elementData[front];
  82. }
  83. //判断循环队列是否为空队列
  84. publicbooleanempty()
  85. {
  86. //rear==front且rear处的元素为null
  87. returnrear==front
  88. &&elementData[rear]==null;
  89. }
  90. //清空循环队列
  91. publicvoidclear()
  92. {
  93. //将底层数组所有元素赋为null
  94. Arrays.fill(elementData,null);
  95. front=0;
  96. rear=0;
  97. }
  98. publicStringtoString()
  99. {
  100. if(empty())
  101. {
  102. return"[]";
  103. }
  104. else
  105. {
  106. //如果front<rear,有效元素就是front到rear之间的元素
  107. if(front<rear)
  108. {
  109. StringBuildersb=newStringBuilder("[");
  110. for(inti=front;i<rear;i++)
  111. {
  112. sb.append(elementData[i].toString()+",");
  113. }
  114. intlen=sb.length();
  115. returnsb.delete(len-2,len).append("]").toString();
  116. }
  117. //如果front>=rear,有效元素为front->capacity之间、0->front之间的
  118. else
  119. {
  120. StringBuildersb=newStringBuilder("[");
  121. for(inti=front;i<capacity;i++)
  122. {
  123. sb.append(elementData[i].toString()+",");
  124. }
  125. for(inti=0;i<rear;i++)
  126. {
  127. sb.append(elementData[i].toString()+",");
  128. }
  129. intlen=sb.length();
  130. returnsb.delete(len-2,len).append("]").toString();
  131. }
  132. }
  133. }
  134. }

3.队列的链式存储结构及实现
Java代码 收藏代码
  1. publicclassLinkQueue<T>
  2. {
  3. //定义一个内部类Node,Node实例代表链队列的节点。
  4. privateclassNode
  5. {
  6. //保存节点的数据
  7. privateTdata;
  8. //指向下个节点的引用
  9. privateNodenext;
  10. //无参数的构造器
  11. publicNode()
  12. {
  13. }
  14. //初始化全部属性的构造器
  15. publicNode(Tdata,Nodenext)
  16. {
  17. this.data=data;
  18. this.next=next;
  19. }
  20. }
  21. //保存该链队列的头节点
  22. privateNodefront;
  23. //保存该链队列的尾节点
  24. privateNoderear;
  25. //保存该链队列中已包含的节点数
  26. privateintsize;
  27. //创建空链队列
  28. publicLinkQueue()
  29. {
  30. //空链队列,front和rear都是null
  31. front=null;
  32. rear=null;
  33. }
  34. //以指定数据元素来创建链队列,该链队列只有一个元素
  35. publicLinkQueue(Telement)
  36. {
  37. front=newNode(element,null);
  38. //只有一个节点,front、rear都指向该节点
  39. rear=front;
  40. size++;
  41. }
  42. //返回链队列的长度
  43. publicintlength()
  44. {
  45. returnsize;
  46. }
  47. //将新元素加入队列
  48. publicvoidadd(Telement)
  49. {
  50. //如果该链队列还是空链队列
  51. if(front==null)
  52. {
  53. front=newNode(element,null);
  54. //只有一个节点,front、rear都指向该节点
  55. rear=front;
  56. }
  57. else
  58. {
  59. //创建新节点
  60. NodenewNode=newNode(element,null);
  61. //让尾节点的next指向新增的节点
  62. rear.next=newNode;
  63. //以新节点作为新的尾节点
  64. rear=newNode;
  65. }
  66. size++;
  67. }
  68. //删除队列front端的元素
  69. publicTremove()
  70. {
  71. NodeoldFront=front;
  72. front=front.next;
  73. oldFront.next=null;
  74. size--;
  75. returnoldFront.data;
  76. }
  77. //访问链式队列中最后一个元素
  78. publicTelement()
  79. {
  80. returnrear.data;
  81. }
  82. //判断链式队列是否为空队列
  83. publicbooleanempty()
  84. {
  85. returnsize==0;
  86. }
  87. //清空链队列
  88. publicvoidclear()
  89. {
  90. //将front、rear两个节点赋为null
  91. front=null;
  92. rear=null;
  93. size=0;
  94. }
  95. publicStringtoString()
  96. {
  97. //链队列为空链队列时
  98. if(empty())
  99. {
  100. return"[]";
  101. }
  102. else
  103. {
  104. StringBuildersb=newStringBuilder("[");
  105. for(Nodecurrent=front;current!=null
  106. ;current=current.next)
  107. {
  108. sb.append(current.data.toString()+",");
  109. }
  110. intlen=sb.length();
  111. returnsb.delete(len-2,len).append("]").toString();
  112. }
  113. }
  114. }

你可能感兴趣的:(java)