1. 程式人生 > 其它 >java資料結構之迴圈佇列(陣列實現)

java資料結構之迴圈佇列(陣列實現)

技術標籤:java資料結構佇列演算法

package com.ws.佇列.陣列環形佇列;
//環形陣列佇列
//判斷滿:尾+1%佇列長度==頭
//新增資料:要(尾+1)%陣列長度
//取出資料:要(頭+1)%陣列長度               因為這兩個都是迴圈的,相當於一個圓環,%陣列長度就是轉圈
//佇列有效資料個數:(尾+陣列長度-頭)%陣列長度   陣列因為是個圈,所以可能出現頭>尾的情況,所以要提前轉一圈,保證尾>頭
//取資料:i%陣列長度
//因為到最後一個時判斷空是尾+1然後取餘,實際陣列最後一個空間存不上,所以實際的有效佇列長度是maxSize-1
import java.util.
Scanner; public class ArrayQueue { public static void main(String[] args) { //測試 Array array=new Array(3); char key=' ';//接收使用者輸入 Scanner scanner=new Scanner(System.in); boolean loop=true; while (loop){ System.out.println("a:顯示佇列"
); System.out.println("b:退出程式"); System.out.println("c:新增資料到佇列"); System.out.println("d:從佇列取出資料"); System.out.println("e:顯示佇列頭資料"); key=scanner.next().charAt(0);//接收一個字元 switch (key){ case
'a': array.printqueue(); break; case 'c': System.out.println("輸入一個數"); int value=scanner.nextInt(); array.addArray(value); break; case 'd': try { int get=array.getArray(); System.out.println("取出的資料是:"+get); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'e': try { System.out.println("佇列頭資料是:"+array.printtou()); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'b': scanner.close(); loop=false; break; default: break; } } System.out.println("程式退出"); } } //使用陣列模擬一個佇列 class Array{ private int maxSize;//陣列最大容量 private int tou;//佇列頭 private int wei;//佇列尾 private int arr[];//陣列,存資料 //建立佇列構造器 public Array(int maxSize){ this.maxSize=maxSize; arr=new int[maxSize]; tou=0;//佇列頭資料 wei=0;//佇列尾資料 } //判斷佇列是否滿 public boolean ifMax(){ return (wei+1)%maxSize==tou; } //判斷佇列是否為空 public boolean ifFull(){ return tou==wei; } //新增資料到佇列 public void addArray(int queue){ //判斷佇列是否滿 if (ifMax()){ System.out.println("佇列滿不能新增資料"); return; } //直接將資料加入 arr[wei]=queue; //尾後移,得考慮取模 wei=(wei+1)%maxSize; } //出佇列 public int getArray(){ //判斷佇列是否為空 if (ifFull()){ //丟擲異常 throw new RuntimeException("佇列為空!不能取資料"); } //指向佇列第一個元素 int value=arr[tou]; tou=(tou+1)%maxSize; return value; } //顯示佇列的所有資料 public void printqueue(){ if (ifFull()){ System.out.println("佇列為空,沒有資料"); return; } //從頭開始遍歷,遍歷有效資料個數 for (int i=tou;i<tou+size();i++){ System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]); } } //求出當前佇列有效資料個數 public int size(){ return (wei+maxSize-tou)%maxSize;//就是轉圈 } //顯示佇列的頭是 public int printtou(){ //判斷佇列空 if (ifFull()){ throw new RuntimeException("佇列空,無頭資料"); } return arr[tou]; } }