資料結構(Java筆記)—佇列(順序佇列)
阿新 • • 發佈:2018-12-11
佇列(Queue)—先進先出線性表,佇列結構具有特殊的運算規則,從資料的邏輯結構來看,佇列結構是一種線性表;從資料的儲存結構來看,佇列結構分為順序佇列結構和鏈式佇列結構;
- 順序佇列結構:使用一組地址連續的記憶體單元依次儲存佇列中的資料。
- 鏈式佇列結構:使用連結串列形式儲存佇列中各元素的值。
從上圖中可以看出,在佇列結構中允許對兩端進行操作,但兩端的操作不同,只能在表的一端進行刪除,稱為隊頭;在表的另一端進行插入,稱為隊尾,如果佇列中沒有資料元素,稱為空佇列。
佇列中常用的操作:
- 入佇列:將一個元素新增到隊尾(相當於到佇列最後排隊等候)。
- 首先判斷隊尾(tail),tail等於MSXLEN(佇列結構陣列最大長度)表示溢位
- 將入佇列元素儲存到tail指向的位置;
- 設定隊尾tail=tail+1;
- 出佇列:將隊頭的元素取出,同時刪除該元素,使後一個元素成為隊頭。
- 首先判斷隊頭(head),head等於tail表示空佇列,進行錯誤處理,否則進行下一步。
- 從佇列首部取出隊頭元素(實際是返回隊頭元素的引用)。
- 修改隊頭head=head+1;
對順序佇列的設計步驟:
- 定義佇列結構(QueueType)
- 初始化佇列(queueInit)
- 計算佇列大小(queueLen)
- 入佇列(queueAdd)
- 出佇列(queueOut)
程式碼實現:
一,定義結點
public class Data {//定義結點 String name; int age; }
二,實現佇列結構
public class Queue { QueueType qt;//定義全域性頭引用 class QueueType{//定義佇列結構 static final int MAXLEN=20; Data[] data=new Data[MAXLEN]; int head;//隊頭 int tail;//隊尾 } void queueInit(){//初始化佇列結構 if((qt=new QueueType())!=null){ qt.head=0; qt.tail=0; } } int queueLen(){//計算佇列中元素的個數 return qt.tail-qt.head; } int queueAdd(Data d){//入佇列 if(qt.tail>=qt.MAXLEN){ System.out.print("佇列溢位!"); return 0; } qt.data[qt.tail++]=d; return 1; } Data queueOut(){//出佇列 if(qt.head==qt.tail){ System.out.print("佇列為空!"); return null; } return qt.data[qt.head++]; } }
三,執行測試
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Queue dt = new Queue();
dt.queueInit();
while (true) {
System.out.println("請輸入:0(退出),1(入佇列),2(出佇列),3(佇列大小)");
int i = in.nextInt();
switch (i) {
case 0:
return;
case 1:
Data d = new Data();
System.out.print("新增姓名:");
String name = in.next();
System.out.print("新增年齡:");
int age = in.nextInt();
if (name == null || age == 0) {
System.out.println("資訊不能為空");
break;
}
d.age = age;
d.name = name;
int temp1 = dt.queueAdd(d);
if (temp1 == 0) {
System.out.println("入隊失敗");
break;
}
System.out.println("入隊成功");
break;
case 2:
Data data = dt.queueOut();
if (data == null) {
System.out.println("出隊失敗");
break;
}
System.out.println("出隊成功");
System.out.println("姓名:" + data.name + "" + "年齡:" + data.age);
break;
case 3:
System.out.println("棧的大小為:" + dt.queueLen());
break;
default:
break;
}
}
}