JAVA數據結構- 環形數組模擬隊列

1.使用普通數組時,定一個m長度的數組

0 1 2 3

     把數據存入數組滿時, 再取出時, 就不能再向這個數組添加數據 ,   因爲該數組最後一個位置

      取模達到環形的效果,  定義兩個指針指向鏈表的第一個節點和最後一個節點(後一位)

2.環形數組

 定義第一個數據也就是第一個先添加的數據的位置   first 初始值爲0

 定義最後一個添加進來的數據  的後一個位置爲     last    初始值爲0    所以實際最大容量爲 max-1

3.添加數據

4.取出數據 

5.查看所有數據 

完整代碼

package dataStructure.環形隊列;

import java.util.Scanner;

public class CircleArrayQueue {

    public static void main(String[] args) {
        //測試一把
        System.out.println("測試數組模擬環形隊列的案例~~~");
        //  創建一個環形隊列
        CircleArray queue = new CircleArray(4); //說明設置 4,  其隊列的有效數據最大是 3
        char key = ' '; //  接收用戶輸入
        Scanner scanner = new Scanner(System.in);//
        boolean loop = true;
        //  輸出一個菜單
        while (loop) {
            System.out.println("s(show):  顯示隊列");
            System.out.println("e(exit):  退出程序");
            System.out.println("a(add):  添加數據到隊列");
            System.out.println("g(get):  從隊列取出數據");
            System.out.println("h(head):  查看隊列頭的數據");
            key = scanner.next().charAt(0);//  接收一個字符
            switch (key) {
                case 's':
                    queue.show();
                    break;
                case 'a':
                    System.out.println("輸出一個數");
                    int value = scanner.nextInt();
                    queue.add(value);
                    break;
                case 'g': //  取出數據
                    try {
                        int res = queue.getOne();
                        System.out.printf("取出的數據是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h': //  查看隊列頭的數據
                    try {
                        queue.showHead();
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e': //  退出
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出~~");
    }


}

class CircleArray {
    private int maxSize;  //定義數組的最大容量,實際最大容量爲maxSize-1 因爲 last指向最後一個數據的後一個
    private int last;      //定義數組最後一個數據的 後一個數據的位置  初始值爲0
    private int first;     //定義數組的第一個數據的位置  初始值爲0
    private int arr[];     //存放數據的數組

    public CircleArray(int maxSize) {
        this.maxSize = maxSize;
        this.arr = new int[maxSize];
    }

    /**
     * 判斷數組是否爲空
     *
     * @return
     */
    public Boolean isEmpty() {
        return last == first;
    }

    /**
     * 判斷數組是否滿,(last+1)%maxSize就是將指針移到開頭,因爲是環形的所以取模
     *
     * @return
     */
    public Boolean isFull() {
        return (last + 1) % maxSize == first;
    }

    /**
     * 添加數據,添加的數據在隊未
     * @param num
     */
    public void add(int num) {
        if (isFull()) {
            System.out.println("隊列滿,不能添加~~");
            return;
        }
        arr[last] = num;         //因爲last就指向最後一個數據的後一個,所以直接是
        last = (last + 1) % maxSize;   //後移一位,考慮環形
    }

    /**
     * 獲得一個數據,獲得的數據是隊首
     *
     * @return
     */
    public int getOne() {
        if (isEmpty()) {
            throw new RuntimeException("隊列空,不能取~~");
        }
        int value = arr[first];
        first = (first + 1) % maxSize;   //後移一位,考慮環形
        return value;
    }

    /**
     * 查看所有數據
     */
    public void show() {
        int length = (last - first + maxSize) % maxSize; //先得到當前數據個數
        //從第一個數開始遍歷就是first
        for (int i = first; i < first + length; i++) {
            System.out.printf("array[%d]=%d\n", i, arr[i]);
        }
    }

    public void showHead() {
        if (isEmpty()) {
            throw new RuntimeException("隊列空,不能查看~~");
        }
        System.out.printf("隊列頭的數據是:%d\n", arr[first]);
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章