欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)隊(duì)列queue數(shù)據(jù)結(jié)構(gòu)詳解

 更新時(shí)間:2022年02月03日 10:41:00   作者:CamphorBloom  
大家好,本篇文章主要講的是java實(shí)現(xiàn)隊(duì)列queue數(shù)據(jù)結(jié)構(gòu)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下

概念

隊(duì)列是一種非原始(特殊)的線性表,是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)。它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作。

FIFO:first input first output,即先添加的元素,先移除,最后添加的元素,最后移除。

工作方式類似于商場(chǎng)排隊(duì)結(jié)賬情形:

數(shù)組模擬隊(duì)列圖示:

隊(duì)列中兩個(gè)主要操作

插入值操作:insert ——》 enqueue(入隊(duì)) ——》參數(shù)是要插入的數(shù)據(jù)data

刪除值操作:remove ——》 dequeue (出隊(duì))——》 無(wú)參

隊(duì)列遵循以下條件:

如果 FRONT = 0,那么隊(duì)列就是空的。

如果 REAR = size of the queue,那么隊(duì)列就是滿了。

如果 FRONT = REAR,那么隊(duì)列中至少有一個(gè)元素。

如果你想知道隊(duì)列中元素的總數(shù),那么使用這個(gè)公式計(jì)算(REAR - FRONT)+1。

隊(duì)列的數(shù)組實(shí)現(xiàn)

我們可以通過數(shù)組、堆棧和鏈表來(lái)實(shí)現(xiàn)隊(duì)列。其中數(shù)組是實(shí)現(xiàn)隊(duì)列的最簡(jiǎn)單方法。

創(chuàng)建一個(gè)大小為 n 的數(shù)組。將 FRONT 和 REAR 的值初始化為 -1,該值表示該數(shù)組當(dāng)前為空。

編寫一個(gè)ArrayQueue類如下:

class ArrayQueue {
	private int maxSize; // 數(shù)組的最大容量
	private int front; // 隊(duì)列頭
	private int rear; // 隊(duì)列尾
	private int[] arr; // 存放數(shù)據(jù), 模擬隊(duì)列
 
	// 創(chuàng)建構(gòu)造器,初始化
	public ArrayQueue(int arrMaxSize) {
		maxSize = arrMaxSize;
		arr = new int[maxSize];
		front = -1; // front 是指向隊(duì)列頭的前一個(gè)位置
		rear = -1;  // rear  是指向隊(duì)列尾的數(shù)據(jù)(最后一個(gè)數(shù)據(jù))
	}
 
	// 判斷隊(duì)列是否已滿
	public boolean isFull() {
		return rear == maxSize - 1;
	}
 
	// 判斷隊(duì)列是否為空
	public boolean isEmpty() {
		return rear == front;
	}
 
	// 添加數(shù)據(jù)
	public void addQueue(int n) {
		if (isFull()) {
			System.out.println("隊(duì)列已滿,不能再添加數(shù)據(jù)了!");
			return;
		}
		rear++; // 讓rear 后移
		arr[rear] = n;
	}
 
	// 獲取數(shù)據(jù)
	public int getQueue() {
		if (isEmpty()) {
			// 通過拋出異常
			throw new RuntimeException("隊(duì)列為空,無(wú)數(shù)據(jù)可取!");
		}
		front++; // front后移
		return arr[front];
 
	}
 
	// 顯示隊(duì)列的所有數(shù)據(jù)
	public void showQueue() {
        if (isEmpty()) {
			System.out.println("隊(duì)列空的,沒有數(shù)據(jù)~~");
			return;
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.printf("arr[%d]=%d\n", i, arr[i]);
		}
	}
 
	// 顯示隊(duì)列的頭部指向的下一個(gè)
	public int headQueue() {
		if (isEmpty()) {
			throw new RuntimeException("隊(duì)列為空,沒有數(shù)據(jù)~~");
		}
		return arr[front + 1];
	}
}

編寫測(cè)試方法:

		//創(chuàng)建一個(gè)隊(duì)列
		ArrayQueue queue = new ArrayQueue(3);
		char key = ' '; 
		Scanner scanner = new Scanner(System.in);//
		boolean loop = true;
		//輸出一個(gè)菜單選項(xiàng)
		while(loop) {
			System.out.println("s(show): 顯示隊(duì)列");
			System.out.println("e(exit): 退出程序");
			System.out.println("a(add): 添加數(shù)據(jù)到隊(duì)列");
			System.out.println("g(get): 從隊(duì)列取出數(shù)據(jù)");
			System.out.println("h(head): 查看隊(duì)列頭的數(shù)據(jù)");
			key = scanner.next().charAt(0);//接收一個(gè)字符
			switch (key) {
			case 's': //顯示隊(duì)列所有數(shù)據(jù)
				queue.showQueue();
				break;
			case 'a': //添加數(shù)據(jù)
				System.out.println("輸出一個(gè)數(shù)");
				int value = scanner.nextInt();
				queue.addQueue(value);
				break;
			case 'g': //依次取出數(shù)據(jù)
				try {
					int res = queue.getQueue();
					System.out.printf("取出的數(shù)據(jù)是%d\n", res);
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println(e.getMessage());
				}
				break;
			case 'h': //查看隊(duì)列頭指向
				try {
					int res = queue.headQueue();
					System.out.printf("隊(duì)列頭的數(shù)據(jù)是%d\n", res);
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println(e.getMessage());
				}
				break;
			case 'e': //退出程序
				scanner.close();
				loop = false;
				break;
			default:
				break;
			}
		}
		
		System.out.println("程序退出~~");
	}

總結(jié)

到此這篇關(guān)于java實(shí)現(xiàn)隊(duì)列queue數(shù)據(jù)結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)隊(duì)列queue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Retrofit+RxJava實(shí)現(xiàn)帶進(jìn)度下載文件

    Retrofit+RxJava實(shí)現(xiàn)帶進(jìn)度下載文件

    這篇文章主要為大家詳細(xì)介紹了Retrofit+RxJava實(shí)現(xiàn)帶進(jìn)度下載文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • java編程簡(jiǎn)單獲取圖片像素的方法

    java編程簡(jiǎn)單獲取圖片像素的方法

    這篇文章主要介紹了java編程簡(jiǎn)單獲取圖片像素的方法,涉及Java針對(duì)圖片的讀取與屬性獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • 關(guān)于Java使用Http輕量級(jí)請(qǐng)求庫(kù)Unirest的方法

    關(guān)于Java使用Http輕量級(jí)請(qǐng)求庫(kù)Unirest的方法

    這篇文章主要介紹了關(guān)于Java使用Http輕量級(jí)請(qǐng)求庫(kù)Unirest的方法,Unirest 是一個(gè)輕量級(jí)的 HTTP 請(qǐng)求庫(kù),可發(fā)起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 請(qǐng)求,支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多種語(yǔ)言,需要的朋友可以參考下
    2023-08-08
  • JVM如何處理異常深入詳解

    JVM如何處理異常深入詳解

    異常處理的兩大元素:拋出異常、捕獲異常,非正常處理的兩個(gè)方法。下面這篇文章主要給大家介紹了關(guān)于JVM如何處理異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2019-01-01
  • Java+Windows+ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換功能

    Java+Windows+ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換功能

    這篇文章主要為大家詳細(xì)介紹了Java+Windows+ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Spring Boot 2和Redis例子實(shí)現(xiàn)過程解析

    Spring Boot 2和Redis例子實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Spring Boot2發(fā)布與調(diào)用REST服務(wù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java利用InputStream類實(shí)現(xiàn)文件讀取與處理

    Java利用InputStream類實(shí)現(xiàn)文件讀取與處理

    在Java開發(fā)中,輸入流(InputStream)是一個(gè)非常重要的概念,它涉及到文件讀寫、網(wǎng)絡(luò)傳輸?shù)榷鄠€(gè)方面,InputStream類是Java中輸入流的抽象基類,定義了讀取輸入流數(shù)據(jù)的方法,本文將以InputStream類為切入點(diǎn),介紹Java中的輸入流概念及其應(yīng)用,需要的朋友可以參考下
    2023-11-11
  • Mybatis動(dòng)態(tài)SQL的示例代碼

    Mybatis動(dòng)態(tài)SQL的示例代碼

    本文主要介紹了Mybatis動(dòng)態(tài)SQL的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • JMeter參數(shù)化4種實(shí)現(xiàn)方式(小結(jié))

    JMeter參數(shù)化4種實(shí)現(xiàn)方式(小結(jié))

    參數(shù)化是自動(dòng)化測(cè)試腳本的一種常用技巧,可將腳本中的某些輸入使用參數(shù)來(lái)代替,JMeter提供了多種參數(shù)化方式,下面就其中常用的4種展開闡述,感興趣的可以來(lái)了解一下
    2021-12-12
  • springboot集成ELK的全過程詳解

    springboot集成ELK的全過程詳解

    ELK其實(shí)并不是某一款軟件,而是一套完整的解決方案,是三個(gè)產(chǎn)品的首字母縮寫,Elasticsearch,Logstash和Kibana,這三個(gè)軟件都是開源軟件,通常配合使用,本文將給大家詳細(xì)介紹一下springboot集成ELK的全過程,需要的朋友可以參考下
    2024-01-01

最新評(píng)論