【數據結構與算法】隊列

文章目錄

  • 一:隊列
    • 1.1 隊列的概念
    • 1.2 隊列的介紹
    • 1.3 隊列示意圖
  • 二:數組模擬隊列
    • 2.1 介紹
    • 2.2 思路
    • 2.3 代碼實現
      • 2.3.1 定義隊列基本信息
      • 2.3.2 初始化隊列
      • 2.3.3 判斷隊列是否滿,是否為空
      • 2.3.4 添加數據到隊列
      • 2.3.5 獲取隊列數據,出隊列
      • 2.3.6 顯示隊列所有數據
      • 2.3.7 顯示隊列頭數據
      • 2.3.8 源碼奉上
    • 2.4 測試ArrayQueue
    • 2.5 問題分析并優化
  • 三:數組模擬環形隊列
    • 3.1 分析
    • 3.2 思路
    • 3.3 代碼實現

一:隊列

1.1 隊列的概念

  • 隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出的特點。
  • 入隊列:進行插入操作的一端稱為隊尾 。
  • 出隊列:進行刪除操作的一端稱為隊頭。

例如:比如生活中排隊買東西,先排隊的先購買

1.2 隊列的介紹

  1. 隊列是一個有序列表,可以用數組或是鏈表來實現。
  2. 遵循先入先出的原則。即:先存入隊列的數據,要先取出。后存入的要后取出

1.3 隊列示意圖

在這里插入圖片描述

二:數組模擬隊列

2.1 介紹

  • 隊列本身是有序列表,若使用數組的結構來存儲隊列的數據,則隊列數組的聲明如下圖, 其中 maxSize 是該隊列的最大容量。

  • 因為隊列的輸出、輸入是分別從前后端來處理,因此需要兩個變量 front及 rear分別記錄隊列前后端的下標,front 會隨著數據輸出而改變,而 rear則是隨著數據輸入而改變,如圖所示:

  • 在這里插入圖片描述

2.2 思路

當我們將數據存入隊列時稱為”addQueue”,addQueue 的處理需要有兩個步驟:思路分析

  1. 將尾指針往后移:rear+1 , 當front == rear 【空】
  2. 若尾指針 rear 小于隊列的最大下標 maxSize-1,則將數據存入 rear所指的數組元素中,否則無法存入數據。 rear == maxSize - 1[隊列滿]

注:
rear 是隊列最后[含]
front 是隊列最前元素[不含]

2.3 代碼實現

2.3.1 定義隊列基本信息

 /*** 最大容量*/private int maxSize;/*** 隊列頭*/private int front;/*** 隊列尾*/private int rear;/*** 該數組用于存放數據*/private int[] arr;

2.3.2 初始化隊列

/*** 初始化隊列構造器** @param arrMaxSize*/public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[arrMaxSize];//指向隊列頭部的前一個位置,不包含頭部front = -1;//指向隊列尾部具體數據rear = -1;}

2.3.3 判斷隊列是否滿,是否為空

/*** 判斷隊列是否滿** @return*/public boolean isFull() {return rear == maxSize - 1;}/*** 判斷隊列是否為空** @return*/public boolean isEmpty() {return front == rear;}

2.3.4 添加數據到隊列

public void addQueue(int n) {//判斷隊列是否滿,滿了就無法添加數據if (isFull()) {System.out.println("隊列滿了,無法添加數據");return;}//添加數據讓rear后移rear++;arr[rear] = n;}

2.3.5 獲取隊列數據,出隊列

  /*** 獲取隊列數據,出隊列** @return*/public int getQueue() {//判斷隊列是否為空if (isEmpty()) {throw new RuntimeException("隊列為空,無法取出數據");}front++;return arr[front];}

2.3.6 顯示隊列所有數據

   /*** 顯示隊列所有數據*/public void showQueue() {//判斷隊列是否為空if (isEmpty()) {System.out.println("隊列為空,沒有數據");}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}}

2.3.7 顯示隊列頭數據

 /*** 顯示隊列頭數據** @return*/public int headQueue() {//判斷隊列是否為空if (isEmpty()) {throw new RuntimeException("隊列為空,沒有數據");}return arr[front + 1];}

2.3.8 源碼奉上


/*** 隊列頭部輸出數據,尾部輸入數據*/
class ArrayQueue {/*** 最大容量*/private int maxSize;/*** 隊列頭*/private int front;/*** 隊列尾*/private int rear;/*** 該數組用于存放數據*/private int[] arr;/*** 初始化隊列構造器** @param arrMaxSize*/public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[arrMaxSize];//指向隊列頭部的前一個位置,不包含頭部front = -1;//指向隊列尾部具體數據rear = -1;}/*** 判斷隊列是否滿** @return*/public boolean isFull() {return rear == maxSize - 1;}/*** 判斷隊列是否為空** @return*/public boolean isEmpty() {return front == rear;}/*** 添加數據到隊列*/public void addQueue(int n) {//判斷隊列是否滿,滿了就無法添加數據if (isFull()) {System.out.println("隊列滿了,無法添加數據");return;}//添加數據讓rear后移rear++;arr[rear] = n;}/*** 獲取隊列數據,出隊列** @return*/public int getQueue() {//判斷隊列是否為空if (isEmpty()) {throw new RuntimeException("隊列為空,無法取出數據");}front++;return arr[front];}/*** 顯示隊列所有數據*/public void showQueue() {//判斷隊列是否為空if (isEmpty()) {System.out.println("隊列為空,沒有數據");}for (int i = 0; i < arr.length; i++) {System.out.printf("arr[%d]=%d\n", i, arr[i]);}}/*** 顯示隊列頭數據** @return*/public int headQueue() {//判斷隊列是否為空if (isEmpty()) {throw new RuntimeException("隊列為空,沒有數據");}return arr[front + 1];}}

2.4 測試ArrayQueue

public class ArrayQueueDemo {public static void main(String[] args) {ArrayQueue queue = new ArrayQueue(3);//接收用戶輸入char key = ' ';Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.println("s(show):顯示隊列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加數據隊列");System.out.println("g(get):取出數據隊列");System.out.println("h(head):查看頭隊列數據");key = scanner.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("輸入一個數字");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的數據為%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h':try {int res = queue.headQueue();System.out.printf("隊列頭數據為%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}case 'e':scanner.close();loop = false;default:break;}}System.out.println("程序退出");}}

2.5 問題分析并優化

問題:目前數組使用一次就無法使用,沒有達到復用的效果
優化:將數組改成環形隊列,進行取模

三:數組模擬環形隊列

3.1 分析

對前面的數組模擬隊列的優化,充分利用數組。因此將數組看做是一個環形的。(通過取模的方式來實現即可)

3.2 思路

  1. front的含義做出如下調整:front就指向隊列的第一個元素,即arr[front]就是隊列的第一個元素。
  2. rear的含義做出如下調整:rear指向隊列最后一個元素的后一個位置。空出一個空間做約定。
  3. 隊列滿的條件:(rear+1)%maxSize = front;
  4. 隊列空的條件:rear == front;
  5. front和rear的初始值都為0;
  6. 隊列中有效數據個數:(rear + maxSize - front)% maxSize;

3.3 代碼實現

package com.sysg.dataStructuresAndAlgorithms.queue;import java.util.Scanner;public class CircleArrayQueueDemo {public static void main(String[] args) {//長度為4,有效長度為3,有一個預留的空間CircleArrayQueue queue = new CircleArrayQueue(4);//接收用戶輸入char key = ' ';Scanner scanner = new Scanner(System.in);boolean loop = true;while (loop) {System.out.println("s(show):顯示隊列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加數據隊列");System.out.println("g(get):取出數據隊列");System.out.println("h(head):查看頭隊列數據");key = scanner.next().charAt(0);switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("輸入一個數字");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的數據為%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h':try {int res = queue.headQueue();System.out.printf("隊列頭數據為%d\n",res);} catch (Exception e) {System.out.println(e.getMessage());}case 'e':scanner.close();loop = false;default:break;}}System.out.println("程序退出");}
}class CircleArrayQueue {/*** 最大容量*/private int maxSize;/*** 隊列頭* 1. front的含義做出如下調整:front就指向隊列的第一個元素,即arr[front]就是隊列的第一個元素。*/private int front;/*** 隊列尾* 2. rear的含義做出如下調整:rear指向隊列最后一個元素的后一個位置。空出一個空間做約定。*/private int rear;/*** 該數組用于存放數據*/private int[] arr;/*** 初始化隊列構造器** @param arrMaxSize*/public CircleArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[arrMaxSize];front = 0;rear = 0;}/*** 判斷隊列是否滿** @return*/public boolean isFull() {//例:front = 1,rear = 5,maxSize = 5,此時隊列就滿了return (rear + 1) % maxSize == front;}/*** 判斷隊列是否為空** @return*/public boolean isEmpty() {return front == rear;}/*** 添加數據到隊列*/public void addQueue(int n) {//判斷隊列是否滿,滿了就無法添加數據if (isFull()) {System.out.println("隊列滿了,無法添加數據");return;}//直接將數據加入arr[rear] = n;//將rear后移,這里必須考慮取模rear = (rear + 1) % maxSize;}/*** 獲取隊列數據,出隊列** @return*/public int getQueue() {//判斷隊列是否為空if (isEmpty()) {throw new RuntimeException("隊列為空,無法取出數據");}//這里需要分析出front是指向隊列的第一個元素//1.先把front的值保存到一個臨時的變量//2.將front后移,考慮取模//3.將臨時變量保存int value = arr[front];front = (front + 1) % maxSize;return value;}/*** 顯示隊列所有數據*/public void showQueue() {//判斷隊列是否為空if (isEmpty()) {System.out.println("隊列為空,沒有數據");}//從front開始遍歷,遍歷多少個元素for (int i = front; i < front + getSize(); i++) {System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);}}/*** 獲取有效數據大小* @return*/public int getSize() {return (rear + maxSize - front) % maxSize;}/*** 顯示隊列頭數據** @return*/public int headQueue() {//判斷隊列是否為空if (isEmpty()) {throw new RuntimeException("隊列為空,沒有數據");}return arr[front];}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41626.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

垃圾回收機制

什么是內存泄漏&#xff1f; 內存泄漏是指程序中已經不再使用的內存卻沒有被正確釋放或回收的情況。在編程中&#xff0c;當對象或數據不再被程序使用&#xff0c;但其所占用的內存空間沒有被垃圾回收機制回收&#xff0c;就會導致內存泄漏。 內存泄漏可能會導致程序的內存消…

圖數據庫_Neo4j和SpringBoot整合使用_創建節點_刪除節點_創建關系_使用CQL操作圖譜---Neo4j圖數據庫工作筆記0009

首先需要引入依賴 springboot提供了一個spring data neo4j來操作 neo4j 可以看到它的架構 這個是下載下來的jar包來看看 有很多cypher對吧 可以看到就是通過封裝的驅動來操作graph database 然后開始弄一下 首先添加依賴

【實用黑科技】如何 把b站的緩存視頻弄到本地——數據恢復軟件WinHex 和 音視頻轉碼程序FFmpeg

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 收錄于專欄&#xff1a;效率…

onnxruntime 支持的所有后端

1 代碼導出 import onnxruntime as ort aaa ort.get_all_providers() print(aaa)1. 1 下面是ort支持的所有后端 TensorrtExecutionProvider, CUDAExecutionProvider, MIGraphXExecutionProvider, ROCMExecutionProvider, OpenVINOExecutionProvider, DnnlExecutionProvider…

Baumer工業相機堡盟工業相機如何通過BGAPISDK設置相機的固定幀率(C#)

Baumer工業相機堡盟工業相機如何通過BGAPI SDK設置相機的固定幀率&#xff08;C#&#xff09; Baumer工業相機Baumer工業相機的固定幀率功能的技術背景CameraExplorer如何查看相機固定幀率功能在BGAPI SDK里通過函數設置相機固定幀率 Baumer工業相機通過BGAPI SDK設置相機固定幀…

藍牙資訊|中國智能家居前景廣闊,藍牙Mesh照明持續火爆

據俄羅斯衛星通訊社報道&#xff0c;中國已成為全球最大的智能家居消費國&#xff0c;占全球50%—60%的市場份額。未來&#xff0c;隨著人工智能技術的發展以及智能家居生態的不斷進步&#xff0c;智能家居在中國的滲透率將加速提升。德國斯塔蒂斯塔調查公司數據顯示&#xff0…

win10系統docker創建ubuntu容器解決開發環境問題

一、win10系統使用docker的原因 最近啊&#xff0c;在學習人工智能-深度學習&#xff0c;用的win10系統進行開發&#xff0c;老是出現一些莫名其妙的問題&#xff0c;無法解決&#xff0c;每天都在為環境問題搞得傷透了腦筋。 說到底還是要使用Linux系統進行開發比較合適。 …

【MT32F006】MT32F006之HT1628驅動LED

本文最后修改時間&#xff1a;2023年03月30日 一、本節簡介 本文介紹如何使用MT32F006連接HT1628芯片驅動LED。 二、實驗平臺 庫版本&#xff1a;V1.0.0 編譯軟件&#xff1a;MDK5.37 硬件平臺&#xff1a;MT32F006開發板&#xff08;主芯片MT32F006&#xff09; 仿真器&a…

LeetCode算法心得——限制條件下元素之間的最小絕對差(TreeSet)

大家好&#xff0c;我是晴天學長&#xff0c;今天用到了Java一個非常實用的類TreeSet&#xff0c;能解決一些看起來棘手的問題。 1 &#xff09;限制條件下元素之間的最小絕對差 2) .算法思路 初始化變量&#xff1a;n為列表nums的大小。 min為整型最大值&#xff0c;用于記錄…

python3 0學習筆記之基本知識

0基礎學習筆記之基礎知識 &#x1f4da; 基礎內容1. 條件語句 if - elif - else2. 錯誤鋪捉try - except(一種保險策略&#xff09;3. 四種開發模式4. 函數&#xff1a;def用來定義函數的5. 最大值最小值函數&#xff0c;max &#xff0c;min6. is 嚴格的相等&#xff0c;is no…

機器學習:基本介紹

機器學習介紹 Hnad-crafted rules Hand-crafted rules&#xff0c;叫做人設定的規則。那假設今天要設計一個機器人&#xff0c;可以幫忙打開或關掉音樂&#xff0c;那做法可能是這樣&#xff1a; 設立一條規則&#xff0c;就是寫一段程序。如果輸入的句子里面看到**“turn of…

C#__使用Type類反射數據的基本用法

// 簡單介紹 // 元數據&#xff08;metadata&#xff09;&#xff1a;與程序及其類型有關的數據。 // 反射&#xff1a;一個運行的程序查看本身元數據或其他程序集中的元數據的行為 // Assembly類&#xff1a;允許訪問給定程序集的元數據&#xff0c;包含了可以加載和執行程序…

Maven框架SpringBootWeb簡單入門

一、Maven ★ Maven:是Apache旗下的一個開源項目,是一款用于管理和構建java項目的工具。 官網:https://maven.apache.org/ ★ Maven的作用: 1. 依賴管理:方便快捷的管理項目依賴的資源(jar包),避免版本沖突問題。 2. 統一項目結構:提供標準、統一的項目結構。 …

LightDB 23.3 plorasql 函數支持inout參數輸出

開篇立意 oracle PLSQL函數中返回值有兩種情況&#xff1a; &#xff08;1&#xff09;使用return返回值&#xff1b; &#xff08;2&#xff09;使用out修飾的參數&#xff08;oracle不支持inout&#xff09; SQL> create function yu(id inout int) return int asbeginn…

【C# 基礎精講】文件讀取和寫入

文件讀取和寫入是計算機程序中常見的操作&#xff0c;用于從文件中讀取數據或將數據寫入文件。在C#中&#xff0c;使用System.IO命名空間中的類來進行文件讀寫操作。本文將詳細介紹如何在C#中進行文件讀取和寫入&#xff0c;包括讀取文本文件、寫入文本文件、讀取二進制文件和寫…

選擇大型語言模型自定義技術

推薦&#xff1a;使用 NSDT場景編輯器 助你快速搭建可二次編輯器的3D應用場景 企業需要自定義模型來根據其特定用例和領域知識定制語言處理功能。自定義LLM使企業能夠在特定的行業或組織環境中更高效&#xff0c;更準確地生成和理解文本。 自定義模型使企業能夠創建符合其品牌…

PAT 1013 Battle Over Cities

個人學習記錄&#xff0c;代碼難免不盡人意。 It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair a…

計算機機房的管理

1 電源問題 不穩定的電源對電腦的使用壽命是一個極大的威脅&#xff0c;特別是對于機房來說危害 性更大。為此&#xff0c;學校要添置必要的穩壓器&#xff0c;設置其正常供電的電壓為 220 伏、電流 為 l6 安對電腦室供電。如有電壓發生偏差&#xff0c;要及時檢查供電情況&…

BDA初級分析——認識SQL,認識基礎語法

一、認識SQL SQL作為實用技能&#xff0c;熱度高、應用廣泛 在對數據分析人員的調查中SQL長期作為熱度排名第-一的編程語言超過Python和R SQL&#xff1a;易學易用&#xff0c;高效強大的語言 SQL&#xff1a;Structured Query Language 結構化查詢語言 SQL&#xff1a;易學…

python threading.Event()用法

紅綠燈例子 Event的用法 import threading,timeeventthreading.Event()def lighter():timesec0event.set()while True:if 5<timesec<10:event.clear()print("紅燈亮")elif timesec>10:event.set()timesec0else:print("綠燈亮")time.sleep(1)tim…