1. 程式人生 > >資料結構(Java筆記)—佇列(順序佇列)

資料結構(Java筆記)—佇列(順序佇列)

佇列(Queue)—先進先出線性表,佇列結構具有特殊的運算規則,從資料的邏輯結構來看,佇列結構是一種線性表;從資料的儲存結構來看,佇列結構分為順序佇列結構和鏈式佇列結構;

  • 順序佇列結構:使用一組地址連續的記憶體單元依次儲存佇列中的資料。
  • 鏈式佇列結構:使用連結串列形式儲存佇列中各元素的值。

從上圖中可以看出,在佇列結構中允許對兩端進行操作,但兩端的操作不同,只能在表的一端進行刪除,稱為隊頭;在表的另一端進行插入,稱為隊尾,如果佇列中沒有資料元素,稱為空佇列。

佇列中常用的操作:

  • 入佇列:將一個元素新增到隊尾(相當於到佇列最後排隊等候)。
  1. 首先判斷隊尾(tail),tail等於MSXLEN(佇列結構陣列最大長度)表示溢位
    ,進行錯誤處理,否則進行下一步。
  2. 將入佇列元素儲存到tail指向的位置;
  3. 設定隊尾tail=tail+1
  • 出佇列:將隊頭的元素取出,同時刪除該元素,使後一個元素成為隊頭。
  1. 首先判斷隊頭(head),head等於tail表示空佇列,進行錯誤處理,否則進行下一步。
  2. 從佇列首部取出隊頭元素(實際是返回隊頭元素的引用)。
  3. 修改隊頭head=head+1

對順序佇列的設計步驟:

  1. 定義佇列結構(QueueType)
  2. 初始化佇列(queueInit)
  3. 計算佇列大小(queueLen)
  4. 入佇列(queueAdd)
  5. 出佇列(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;
			}
		}
	}