用數組模擬隊列


隊列:

1,隊列是一種先進先出的線性表,它只允許在表的一段進行插入,而在另一端刪除元素,在隊列中,允許插入的一段叫做隊尾(rear),允許刪除的一端則稱為隊頭。

2,舉例:①銀行叫號排隊

                ②操作系統中的作業排隊:在允許多道程序運行的操作系統中,同時有幾個作業運行,如果運行的結果都需要用通道輸出,那就要按請求輸出的先后次序排隊。每當通道傳輸完畢可以接受新的輸出任務時,隊頭的作業先從隊列中推出作輸出操作。凡是申請輸出的作業都從隊尾進入隊列

3,數組模擬隊列示意圖:

 

 

 4,數組模擬隊列思路:

首先,如上圖所示:

  • MaxSize是該隊列的最大容量
  • 因為隊列的輸入輸出分別從兩端進行,因此用兩個變量front和rear分別記錄兩端的下標,front會隨着數據輸出而改變,rear會隨着數據輸入而改變
  • 當我們將數據存入隊列時,rear+1,如果rear==front,則說明隊列為空;如果rear==MaxSize-1,則說明隊列已滿

5,代碼實現

 

package com.boogie.QueueArr;

import java.util.Scanner;

public class QueueArr {
    public static void main(String[] args) {
        ArrQueue queue=new ArrQueue(3);
        char key=' ';
        Scanner scan=new Scanner(System.in);
        boolean loop=true;
        while(loop) {
            System.out.println("s(show):顯示隊列");
            System.out.println("a(add):添加數據到隊列");
            System.out.println("g(get):從隊列取出數據");
            System.out.println("h(head):查看隊列頭的數據");
            System.out.println("e(exit):退出程序");
            key=scan.next().charAt(0);
        
        switch(key) {
        case's':
            queue.showQueue();
            break;
        case'a':
            System.out.println("請輸入一個數字:");
            int value=scan.nextInt();
            queue.addQueue(value);
            break;
        case'g':
            try {
                int res=queue.getQueue();
                System.out.printf("取出的數據是%d\n",res);
            } catch (Exception e) {
            
                System.out.println(e.getMessage());
            }
            break;
        case'h':
            try {
                int res=queue.headQueue();
                System.out.printf("隊列頭的數據是:%d\n",res);
                
            } catch (Exception e) {
                
                System.out.println(e.getMessage());
            }
            break;
        case'e':
            scan.close();
            loop=false;
            break;
            default:
                break;
        }
            
        }
        System.out.println("程序退出~~");
    }
}
//使用數組模擬隊列——編寫一個QueueArr類
class ArrQueue{
    private int Maxsize;//表示數組的最大容量
    private int front;//隊列頭
    private int rear;//隊列尾
    private int[] Arr;//用於存放數據
    
    //創建隊列的構造器
    public ArrQueue(int ArrMaxsize) {
        Maxsize=ArrMaxsize;
        Arr=new int[Maxsize];
        front=-1;
        rear=-1;
    }

//判斷隊列是否滿
public boolean QueueisFull(){
    return  rear==Maxsize-1;
}
//判斷隊列是否空
public boolean QueueisEmpty() {
    return rear==front;
}
//添加數據到隊列
public void addQueue(int n) {
    if(QueueisFull()) {
        System.out.println("隊列已滿,無法加入數據");
        return;
    }
    rear++;//rear后移
    Arr[rear]=n;
}
//獲取隊列數據,出隊列
public int getQueue(){
    if(QueueisEmpty()) {
        throw new RuntimeException("隊列為空,沒有數據");
        }
    front++;
    return Arr[front];
}
//顯示隊列的所有數據
    public void showQueue(){
        if(QueueisEmpty()) {
            System.out.println("隊列為空,沒有數據");
            return;
        }for(int i=0;i<Arr.length;i++) {
        System.out.printf("Arr[%d]=%d\n",i,Arr[i]);
        }
    }
    //顯示隊列的頭數據
    public int headQueue() {
        if(QueueisEmpty()) {
            System.out.println("隊列為空,沒有數據");
            }return Arr[front+1]; 
            
    }
}

運行結果:

 


免責聲明!

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



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