2.1資料結構學習筆記--佇列

lrjajq發表於2020-12-18

3 佇列

概念:一個有序列表,可以使用陣列或連結串列實現
特點:先進先出

3.1使用陣列模擬佇列:

在這裡插入圖片描述

圖中的Queue代表佇列,MaxSize代表佇列最大容量,rear代表尾部、front代表頭部。入隊時rear數值(由-1變大)變化,出隊時front數值(由-1變大)變化

3.1.1思路分析:

  1. 當front == rear [空佇列],將尾指標往後移:rear+1,資料存入rear所指元素
  2. 當rea r== maxsize-1【佇列滿】,佇列無法儲存資料

3.1.2佇列實現程式碼:


public class ArrayQueue {
    private int maxSize; //佇列容量
    private int front; //佇列頭部
    private int rear;//佇列尾部
    private int[] arr;//佇列陣列

    //建立佇列構造器
    public ArrayQueue(int max){
        maxSize=max;//指定佇列的容量大小
        arr=new int[maxSize];
        front=-1;//初始狀態,頭部指向佇列(從零開始) 的外面
        rear=-1;//初始狀態,尾部也指向佇列(從零開始) 的外面
    }

    //判斷佇列是否以滿
    public boolean isFull(){
        return rear == maxSize-1;
    }

    //判斷佇列為空
    public boolean isEmpty(){
        return front==rear;
    }

    //顯示佇列的頭資料
    public int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("佇列是空的");
        }
        return arr[front+1];
        //front初始在佇列外面,當front加一時,指向了第一個資料 注意:此時front的值是不變的,
    }

    //入隊
    public void addQueue(int n){
        if (isFull()){
            System.out.println("佇列滿了");
            return;
        }
        rear++; //rear初始在佇列外面,當rear加一時,指向了陣列的第一個空間
        arr[rear]=n;
    }

    //出隊
    public int getQueue(){
        if (isEmpty()){
            throw new RuntimeException("佇列是空的");
        }
        front++;
        return arr[front];
    }
    //顯示佇列的所有資料
    public void showQueue(){
        if (isEmpty()){
            System.out.println("佇列是空的");
            return;
        }
        for (int i=0;i<arr.length;i++){
            System.out.println("arr的資料為:{"+arr[i]+"}");
        }
    }
}

3.1.3佇列操作的小程式:


import java.util.Scanner;

public class ArrayQueueTest {
    public static void main(String[] args) {
        //建立佇列
        ArrayQueue queue = new ArrayQueue(3);
        //鍵盤輸入資料
        Scanner scanner = new Scanner(System.in);


        //設計選單操作佇列
        boolean loop=true;
        while (loop){
            System.out.println("h(head):檢視佇列頭部資料");
            System.out.println("s(show):顯示佇列的資料");
            System.out.println("a(add):資料入隊");
            System.out.println("g(get):資料出隊");
            System.out.println("e(exit):退出選單");
            System.out.printf("輸入操作:");
            char key=scanner.next().charAt(0);//用於接收使用者輸入,charAt(0):輸入的首字元
            switch (key){
                case 'h':

                    try {
                        int queue1 =  queue.headQueue();
                        System.out.println("佇列頭部資料:"+queue1);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    };break;
                case 's':
                    queue.showQueue();break;
                case 'a':
                    System.out.printf("輸入一個資料入隊:");
                    int value=scanner.nextInt();
                    queue.addQueue(value);break;
                case 'g':
                    try {
                        int queue1 = queue.getQueue();
                        System.out.println("資料出隊:"+queue1);
                    }catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();//關閉鍵盤輸入
                    loop=false;
                    break;
                default:
                    System.out.println("無效操作");break;

            }
        }
        System.out.println("程式結束");
    }
}

3.1.4 問題

陣列僅可使用一次

3.1.5 優化

將陣列改造成環型佇列

3.1 陣列模擬環型佇列:(取模法)(18號晚更新)

相關文章