隊列——使用數組模擬環形隊列

1、思路分析java

      上一篇講到用數組模擬隊列,數組沒法複用,下面講解了用數組模擬環形隊列的方法,採用取模的方式,使得數組能夠重複使用。 數組

     

 

      首先先對front和rear的含義作了一個調整,front指向隊列的第一個元素,rear指向隊列最後一個元素的後一個位置。隊列滿的條件是(rear +1) % maxSize = front ,其中maxSize表示隊列的容量。假如maxSize=10, 犧牲掉一個位置,front = 0,此時若rear = 9,隊列就已經滿了。隊列爲空的條件是rear == front 。另外與上一篇不一樣的是,這裏的位置都不是絕對位置,而是須要%maxSize。ide

2、代碼實現oop

package com.atguigu.queue;

import java.util.Scanner;

public class CircleArrayQueueDemo {

    public static void main(String[] args) {
        // 測試一把
        // 測試數組模擬環形隊列的案例
        //建立一個隊列
        CircleArray circleQueue = new CircleArray(4);
        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':
                circleQueue.showQueue();
                break;
            case 'a':
                System.out.println("請輸入一個數據:");
                int value = scanner.nextInt();
                circleQueue.addQueue(value);
                break;
            case 'g':
                try {
                    int res = circleQueue.getQueue();
                    System.out.printf("取出的數據爲:%d\n",res);
                }catch(Exception e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 'h':
                try {
                    int res = circleQueue.headQueue();
                    System.out.printf("隊列頭的數據爲:%d\n",res);
                }catch(Exception e) {
                    System.out.println(e.getMessage());
                }
                break;
            case 'e':
                scanner.close();
                loop = false; 
                System.out.println("程序退出");
                break;
                 
            }
        
        }

    }    

}


class CircleArray {
    private int maxSize; //表示數組的最大容量
    //front 變量的含義作一個調整: front就指向隊列的第一個元素
    //front 的初始值 = 0
    private int front; //隊列頭
    
    // rear 變量的含義作一個調整:rear指向隊列最後一個元素的後一個位置,但願預留一個空位做爲約定
    private int rear;  //隊列尾
    private int[] arr; //該數組用於存放數據,模擬隊列
    
    //建立隊列的構造器
    public CircleArray(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        
    }    
    
    //判斷隊列是否已滿
    public boolean isFull() {
      return (rear + 1) % maxSize == front;
    }
    
    
    // 判斷隊列是否爲空
    public boolean isEmpty() {
        return rear == front;
    }
    
    //添加數據到隊列
    public void addQueue(int n) {
        // 判斷隊列是否已滿
        if(isFull()) {
            System.out.println("隊列滿,不能加入");
            return;
        }
        arr[rear] = n;
        rear = (rear+1)% maxSize; //讓rear後移
        
    }
    
    
    //獲取隊列的數據,出隊列
    public int getQueue() {
        // 判斷隊列是否空
        if(isEmpty()) {
            // 經過拋出異常
            throw new RuntimeException("隊列空,不能取數據");    
        }
        int value = arr[front];
        front = (front+1) % maxSize;  //讓front後移
        return value;
    }
    
    // 顯示隊列的全部數據
    public void showQueue() {
            //遍歷 
        if(isEmpty()) {
            System.out.println("隊列空的,沒有數據");
            return;
        }
        for (int i = front; i < front + size(); i++) {
            System.out.printf("arr[%d] = %d\n", i % maxSize,arr[i % maxSize]);
        }
    }
    //求出當前隊列有效數據的個數
    public int size() {
        return (rear+maxSize-front) % maxSize;
    }
    //顯示隊列的頭數據,注意不是取出數據
    public int headQueue() {
        if(isEmpty()) {
            throw new RuntimeException("隊列空的,沒有數據");
        }
        return arr[front % maxSize];
    }
        
}
View Code
相關文章
相關標籤/搜索