隊列具有先進先出的特點,從隊尾添加元素,從隊首刪除元素。對於隊列,通常有兩種實現方式:數組和鏈表。
1 利用數組來實現隊列
- 利用兩個指針font,rear分別指向隊列的頭部與尾部
- 爲了能夠有效利用數組空間,採用循環隊列的方式去實現。
- 入隊時,元素添加到rear指針處,然後real指針後移一位
- 出隊時,刪除並返回font指針所指元素,然後font指針後移一位
- 入隊時,需要判斷隊列是否已滿。
- 出隊時,需要判斷隊列是否爲空。
- 爲了判斷隊列爲空或者已滿的情況,通常有兩種方式:
- 1、利用一個變量size來記錄隊列實際元素的個數
- 2、將數組空出一位來區分滿和空情形
package basicKnowledge.集合框架.queue;
/**
* @基本功能:利用數組實現一個循環隊列
* @program:summary
* @author:peicc
* @create:2019-07-24 10:11:06
**/
public class MyArrayQueue<E> {
private int size;//隊列元素個數
private int length;//數組實際長度
private int font;//指向隊頭
private int rear;//指向隊尾
private Object[] element;//存儲隊列元素
private final int DEFAULT_SIZE=10;
//無參構造函數
MyArrayQueue(){
this.element=new Object[DEFAULT_SIZE];
this.font=0;
this.rear=0;
this.length=DEFAULT_SIZE;
}
MyArrayQueue (int initCapacity) {
this.element=new Object[initCapacity];
this.font=0;
this.rear=0;
this.length=initCapacity;
}
//MyArrayQueue類型的構造函數,實現隊列初始化
MyArrayQueue(MyArrayQueue<? extends E> c){
//自己去實現
}
//返回元素的個數
public int getSize(){
return (rear-font+length)%length;
}
//入隊
public boolean enQueue(E e){
//首先判斷隊列是否已滿
if((rear+1)%length==font){
throw new IndexOutOfBoundsException("隊列已滿");
}
element[rear]=e;//元素置於隊尾
rear=(rear+1)%length;//rear後移一位,若到末尾則轉移到數組頭部
return true;
}
//出隊,獲取並移除隊列頭部元素
public E deQueue(){
//首先判斷隊列是否爲空
if(font==rear){
return null;
}
E ele=(E)element[font];
font=(font+1)%length;//rear後移一位,若到末尾則轉移到數組頭部
return ele;
}
//獲取隊列頭部元素,但不刪除
public E getFirst(){
if(font==rear){
return null;
}
return (E)element[font];
}
//隊列是否爲空
public boolean isEmpty(){
return font==rear?true:false;
}
public static void main(String[] args) {
MyArrayQueue<Integer> myArrayQueue=new MyArrayQueue<>(11);
for(int i=0;i<10;i++){
myArrayQueue.enQueue(i);
}
System.out.println();
System.out.println("隊列元素的個數爲:"+myArrayQueue.getSize());
System.out.println("----------打印輸出-----------");
while(!myArrayQueue.isEmpty()){
System.out.print(myArrayQueue.deQueue()+" ");
}
}
}
2 利用鏈表來實現隊列
- 利用兩個指針分別指向鏈表的頭部與尾部
- 入隊時,向鏈表尾部添加元素
- 出隊時,在鏈表頭部刪除元素
- 是不是很簡單!!!
package basicKnowledge.集合框架.queue;
/**
* @基本功能:利用鏈表實現隊列
* @program:summary
* @author:peicc
* @create:2019-07-24 10:59:06
**/
public class MyListQueue<E> {
Node<E> font;//指向隊頭
Node<E> rear;//指向隊尾
private static class Node<E>{
E item;
Node<E> next;//指向下一個節點
Node(E ele){
this.item=ele;
this.next=null;
}
}
//入隊
public void enQueue(E e){
Node<E> newNode=new Node(e);
if(font==null){//如果鏈表爲空
font=newNode;
rear=newNode;
}else{
rear.next=newNode;
rear=newNode;
}
}
//出隊
public E deQueue(){
if(font==null){
return null;
}
Node<E> node=font;
node.next=null;//斷開連接
font=font.next;
return node.item;
}
public static void main(String[] args) {
MyListQueue myListQueue=new MyListQueue();
for(int i=0;i<100;i++){
myListQueue.enQueue(i);
}
System.out.println("*********** 輸出隊列元素**********");
while(myListQueue.font!=null){
System.out.print(myListQueue.deQueue());
}
}
}