java實現順序隊列


package queue;

import java.util.Scanner;

public class ArrayQueueLoop
{

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        //測試代碼
        //測試數組循化隊列
        CircleQueue testQueue=new CircleQueue(4);//設置的是有效的數據,存在有一個空間作為約定
        char key=' ';//接受用戶的輸入
        Scanner in=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=in.next().charAt(0);
            switch (key)
            {
            case 's':
                testQueue.showQueue();
                break;
            case 'e':
                in.close();
                loop=false;
                break;
            case 'a':
                System.out.println("請輸入要入隊的數字:");
                int add=in.nextInt();
                testQueue.addQueue(add);
                break;
            case 'g':
                try
                {
                    System.out.printf("出隊的元素為:%d\n",testQueue.getQueue());
                }
                catch (Exception e) {
                    // TODO: handle exception
                    System.out.println(e.getMessage());
                }
                
                break;
            case 'h':
                try
                {
                    System.out.printf("隊首元素為:%d\n",testQueue.headQueue());
                }
                catch (Exception e) {
                    // TODO: handle exception
                    System.out.println(e.getMessage());
                }
                
                break;

            default:
                break;
            }
            
        }
        System.out.println("退出成功!");

    }

    
}

class CircleQueue
{
    private int maxSize;//數組的最大容量
    private int front;//指向隊列的頭
    private int rear;//指向隊列的尾部
    
    private int[] arr;//該數組用於存放隊列,模擬隊列
    
    //創建隊列的構造器
    public CircleQueue(int arrMaxSize)
    {
        maxSize=arrMaxSize;
        arr=new int[maxSize];
        front=0;//指向隊列的頭部,初始值為0
        rear=0;//指向隊列的尾部的后一個位置,初始值為0
    }
    //判斷隊列是否滿
    public boolean isFull()
    {
        return rear==maxSize-1;
    }
    
    //判斷隊列是否為空
    public boolean isEmpty()
    {
        return rear==front;
    }
    
    //添加數據到隊列
    public void addQueue(int n)
    {
        //判斷隊列是否滿了
        if(isFull())
        {
            System.out.println("隊列滿,不能加入數據!");
        }
        //直接將數據加入就好了
        arr[rear]=n;
        //將rear后移此處必須取模
        rear=(rear+1)%maxSize;
    }
    
    //獲取隊列的數組,數據出隊列
    public int getQueue()
    {
        //判斷隊列是不是空了
        if(isEmpty())
        {
            //拋出異常
            throw  new RuntimeException("隊列空,不能夠取數據!");
        }
        else//不為空
        {
            //這里需要分析出,front是隊列第一個元素
            //1.先front的對應的值保存到一個臨時的變量
            //2.front后移
            //3.將臨時保存的變量返回
            int value=arr[front];
            front=(front+1)%maxSize;
            return value;
        }
    }
    //顯示隊列所有的數據
    public void showQueue()
    {
        //簡單的遍歷
        if(isEmpty())
        {
            System.out.println("隊列為空,沒有數據!");
            return;
        }
        //思路從front開始遍歷,遍歷時候要遍歷多少個元素就可以了
        //要求出當前隊列的個數
        for(int i=front;i<(front+getQueueElementNumbers());i++)
        {
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);//注意可能會越界,所以要取模
        }
    }
    //返回當前隊列有多少元素
    public int getQueueElementNumbers()
    {
        return (rear+maxSize-front)%maxSize;
    }
    
    //顯示隊列的頭數據,注意不是取出數據
    public int headQueue()
    {
        //判斷隊列已經為空就沒有頭數據
        if(isEmpty())
        {
            System.out.println("隊列空的,沒有數據!");
            throw new RuntimeException("隊列空的,沒有數據!");
        }
        return arr[front];
    }
}

 


免責聲明!

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



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