java資料結構之迴圈佇列(陣列實現)
阿新 • • 發佈:2021-01-10
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];
}
}