Java對隊列的基本操作


數據結構之基本數據結構---隊列:先入先出

百度百科:

  隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,

隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

1.自定義隊列實現:

代碼展示:

package queue;

import java.lang.reflect.Array;

/**
 * @Author YangHe
 * @Date 2020/4/14 16:45
 * 手動實現:對列的基本操作
 *  先進先出:FIFO
 */
public class QueueTest<T> {
    private int queueSize; //隊列大小
    private int base; //基地址
    private int front; //隊列頭
    private int rear; //隊列尾
    private T[] array; //存儲使用數組來實現

    /**
     * 初始化隊列
     * @param type 數組類型
     * @param queueSize 數組大小
     */
    public QueueTest(Class<T> type,int queueSize){
        this.queueSize=queueSize;
        this.front=this.rear=0;
        this.base=0;
        array= (T[])Array.newInstance(type,queueSize);
    }
    //隊列是否為空
    public boolean isEmpty(){
        return front==rear;
    }
    //隊列是否已滿
    public boolean isFull(){
        return (rear+2)%queueSize==front;  //為區分為空或者滿 設置容量-1 為滿
    }
    //入隊列
    public void offer(T n){
        if(!isFull()){
            if(rear==(queueSize-1)){
                array[rear]=n;
                rear=base;  //重新指向底部
            }else{
                array[rear++]=n;
            }
        }else{
            System.out.println("隊列已滿!");
        }
    }
    //出隊列不刪除
    public T peek(){
        if(!isEmpty()){
            return array[front];
        }else{
            return null;
        }
    }
    //出隊列刪除元素
    public T poll(){
        if(!isEmpty()){
            if(front==(queueSize-1)){
                T t= array[front];
                front=base;
                return t;
            }else{
                return array[front++];
            }
        }else{
            return null;
        }
    }
    //獲取隊列長度
    public int getQueueLength(){
        return Math.abs(rear-front);
    }
    public static void main(String[] args) {
        QueueTest<Integer> queueTest=new QueueTest<>(Integer.class,5);
        for(int i=0;i<10;i++){
            System.out.println(i+"+++++");
            queueTest.offer(i);
            System.out.println("隊列尾:"+queueTest.rear);
            System.out.println("隊列頭:"+queueTest.front);
            System.out.println("隊列長度:"+queueTest.getQueueLength());
            queueTest.poll();
            System.out.println("隊列尾:"+queueTest.rear);
            System.out.println("隊列頭:"+queueTest.front);
            System.out.println("隊列長度:"+queueTest.getQueueLength());
        }
    }

}
View Code

結果輸出:

 

 

2.通過collection接口下的Queue實現單端隊列 該示例代碼只是展示部分功能,其他功能自行探索:

示例代碼:

package queue;

import java.util.PriorityQueue;

/**
 * @Author YangHe
 * @Date 2020/4/17 0:05
 *  通過collection接口下的Queue實現單端隊列
 *  該示例代碼只是展示部分功能,其他功能自行探索
 */
public class PriorityQueueTest {
    public static void main(String[] args) {
        PriorityQueue pq=new PriorityQueue();
        pq.add("Java基礎"); //添加隊列元素
        pq.add("python基礎");
        pq.add("MySQL基礎");
        pq.add("Linux基礎");
        System.out.println("輸出隊列長度:"+pq.size());
        System.out.println("輸出隊列"+pq);
        System.out.println("取出不刪除隊列元素:"+pq.peek()+"  輸出隊列長度:"+pq.size());
        System.out.println("取出不刪除隊列元素:"+pq.peek()+"  輸出隊列長度:"+pq.size());
        System.out.println("取出不刪除隊列元素:"+pq.peek()+"  輸出隊列長度:"+pq.size());
        System.out.println("輸出隊列"+pq);
        System.out.println("取出並且刪除隊列元素:"+pq.poll()+"  輸出隊列長度:"+pq.size());
        System.out.println("取出並且刪除隊列元素:"+pq.poll()+"  輸出隊列長度:"+pq.size());
        System.out.println("取出並且刪除隊列元素:"+pq.poll()+"  輸出隊列長度:"+pq.size());
        System.out.println("輸出隊列"+pq);
    }
}
View Code

示例結果:

 

 3.實際運用實例:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM