【數據結構】數組循環隊列的實現

隊列(Queue)是一種特殊的線性數據結構,它遵循FIFO(First In First Out,先入先出)的原則。隊列只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。隊列中沒有元素時,稱為空隊列。

隊列的數據元素又稱為隊列元素。在隊列中插入一個隊列元素稱為入隊,從隊列中刪除一個隊列元素稱為出隊。因為隊列只允許在一端插入,在另一端刪除,所以又稱為先進先出(FIFO—first in first out)線性表,簡稱隊列。

在程序中,隊列常常被用來處理需要按一定順序處理的任務,例如打印任務隊列、線程任務調度等。此外,隊列也在許多算法中發揮著重要作用,如廣度優先搜索(BFS)等。

隊列的實現方式有多種,包括基于數組的靜態隊列、基于鏈表的動態隊列等。在實際應用中,可以根據具體需求選擇合適的隊列實現方式。

隊列的主要特點包括:

先進先出:隊列中的元素按照進入隊列的先后順序依次出隊。
操作受限:隊列只允許在隊尾插入元素(入隊),在隊頭刪除元素(出隊),其他位置的元素無法直接訪問或修改。
有序性:由于遵循FIFO原則,隊列中的元素始終保持一定的順序。

隊列的鏈式存儲結構為:

typedef int QDataType;
// 鏈式結構:表示隊列
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 隊列的結構 
typedef struct Queue
{QNode* front;QNode* rear;int size;
}Queue;

隊列的順序存儲結構為:

#define MAXQSIZE 100 //隊列可能達到的最大長度
typedef struct
{QElemType* base;    //存儲空間的基地址int front;          //頭指針int rear;           //尾指針
}SqQueue;

在這里插入圖片描述

假設當前隊列分配的空間最大為6,則當隊列處于上圖的最后一個狀態時,就不可以在繼續插入新的隊尾元素,否則會出現溢出的情況,即因數組越界而導致程序的非法操作錯誤。但是隊列的實際空間并未占滿,這種現象就被稱為假溢出。
那么怎么解決這個問題呢?
我們就可以運用一個較為巧妙的方法:循環隊列
在這里插入圖片描述
但這里我們面臨一個問題,就是front==rear的時候時隊空還是隊滿
可以發現并不好來判斷
下面我們就有兩種方法來解決下列問題

多開辟用一個空間(即少用一個元素空間),假設隊列的空間為k+1,但當有m個元素的時候就認為時隊滿
即(Q.rear + 1)%(k+1) == Q.front即為隊滿,Q.rear == Q.front時為隊空
用一個標志位來Size判斷隊列是空還是隊滿
即當Size == k時為隊滿,Size == 0時為隊空

下面我們就用一種方法來實現循環隊列

結構體定義:

typedef int QDataType;
typedef struct {QDataType* a;int front;//指向頭int rear;//指向尾的下一位int k;//隊列的長度
} MyCircularQueue;

創建隊列

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//開辟一個大小為(k+1)的數組空間,多開一個空間以便判斷隊列為空還是滿的//防止假溢出現象obj->a = (QDataType*)malloc((k + 1) * sizeof(QDataType));obj->k = k;obj->front = obj->rear = 0;return obj;
}

判斷隊空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->rear == obj->front;
}

判斷隊滿

bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear + 1) % (obj->k + 1) == obj->front;
}

入隊

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if (myCircularQueueIsFull(obj)){return false;}obj->a[obj->rear] = value;obj->rear++;obj->rear %= obj->k + 1;return true;
}

出隊

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj)){return false;}obj->front++;obj->front %= obj->k + 1;return true;
}

取出隊頭元素

int myCircularQueueFront(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}

取出隊尾元素

int myCircularQueueRear(MyCircularQueue* obj) {if (myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)];
}

銷毀隊列

void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

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

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

相關文章

MySQL中導出CSV格式數據 | Java處理CSV數據

1. 導出不帶表頭的CSV數據 SELECT dataid, recordfilename INTO OUTFILE /tmp/uk_callcenter_event3.csv FIELDS TERMINATED BY , LINES TERMINATED BY \n FROM table_name WHERE createtime > 2024-03-27 22:00:00 AND createtime < 2024-04-29 23:59:59 AND timehou…

使用selenium控制已經打開的瀏覽器,應該如何實現。

要使用Selenium控制一個已經打開的瀏覽器實例&#xff0c;你可以通過以下步驟實現&#xff0c;這里以Google Chrome瀏覽器為例&#xff1a; 步驟 1: 啟動Chrome瀏覽器并啟用遠程調試 首先&#xff0c;你需要以遠程調試模式啟動Chrome瀏覽器。這可以通過在命令行中使用特定參數來…

python下載及安裝

1、python下載地址&#xff1a; Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2、python安裝 &#xff08;1&#xff09; 直接點擊下載后的可執行文件.exe &#xff08;2&…

Spring Boot項目怎么集成Gitee登錄

一、背景 現在的越來越多的項目&#xff0c;需要集成第三方系統進行登錄。今天我們以Spring Boot項目集成Gitee為例&#xff0c;演示一下怎么使用Oauth2協議&#xff0c;集成第三方系統登錄。 不了解oauth2的&#xff0c;可以看我之前的文章。Ouath2是怎么實現在第三方應用認…

MySQL創建儲存過程函數

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 學號,createDate datetime DEFAULT NULL COMMENT 創建時間,modifyDate datetime DEFAULT NULL COMMENT 修改時間,userName varchar(30) NOT NULL COMMENT 學生名稱,pwd varchar(36) DEFAULT NULL COMME…

代碼隨想錄算法訓練營第五十二天

今日效率低下&#xff0c;努力把題做完。做快一點&#xff01;&#xff01;&#xff01; 300.最長遞增子序列 class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() 1) return 1;vector<int>dp(nums.size(),1);int result 0;for(i…

計算機畢業設計Python+Spark知識圖譜課程推薦系統 課程預測系統 課程大數據 課程數據分析 課程大屏 mooc慕課推薦系統 大數據畢業設計

1 緒 論 1.1 課題研究背景 在線教育學習平臺是學生用來進行校內或校外拓展課程學習的平臺&#xff0c;平臺需要具備在線視頻觀看&#xff0c;作業提交&#xff0c;形成性考核等功能。在學生學習的過程中&#xff0c;學校的管理者或負責教師需要了解學生的學習情況和學習狀態&…

Spring STOMP-發送消息

如果你想要從應用程序的任何地方向連接的客戶端發送消息&#xff0c;要怎么做&#xff1f;任何應用程序組件都可以向brokerChannel發送消息。要這樣做&#xff0c;最簡單方法是注入一個SimpMessagingTemplate并使用它來發送消息。通常&#xff0c;你會按類型注入它&#xff0c;…

WWW服務器搭建(2)——Apache服務器配置與管理

一、Apache簡介 1.1 關于Apache Apache HTTP Server&#xff08;簡稱Apache&#xff09;是Apache軟件基金會的一個開放源碼的Web服務器&#xff0c;可以在大多數計算機操作系統中運行&#xff0c;由于其跨平臺和安全性被廣泛使用&#xff0c;是最流行的Web服務器端軟件之一。…

01-02-5

1、單鏈表中按位置查找 a.原理 通過傳遞的位置&#xff0c;返回該位置對應的地址&#xff0c;放到主函數定義的指針變量中。 我們認為位置從&#xff1a;有數據的節點開始計數 即如下結構&#xff1a; 查找位置&#xff0c;就是返回該位置對應的空間地址。 b.代碼說明 Ⅰ…

H5嵌入原生----兼容安卓與ios

主要分UI展示&#xff0c;鍵盤&#xff0c;輸入框等等。解決bug最苦惱的問題不是沒有解決方案&#xff0c;而是你沒有找到真正的原因。再就是現象難以重現&#xff0c;每次都要發布代碼&#xff0c;然后到手機app中去測試&#xff0c;模擬。這些地方會耗費大量的精力。 一、UI…

【軟設】常見易錯題匯總

目錄 計算機系統基礎 程序語言基礎 數據結構 算法設計與分析 計算機網絡與信息安全 軟件工程基礎 開發方法&#xff08;結構化與面向對象&#xff09; 數據庫 操作系統 知識產權相關的法律法規 &#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f92f;&#x1f9…

《系統架構設計師教程(第2版)》第10章-軟件架構的演化和維護-07-軟件架構維護

文章目錄 1. 軟件架構知識管理1.1 概念1.2 架構知識的獲取1.3 作用1.4 架構知識管理的現狀 2 軟件架構修改管理3 軟件架構版本管理4. 示例4.1 背景4.2 數據獲取4.3 數據計算4.4 結果分析4.4.1 圈復雜度 (CCN)4.4.2 扇入扇出度 (FFC)4.4.3 模塊間耦合度 (CBO)4.4.4 模塊的響應 (…

mysql group by 細節介紹

mysql中group by的用法是配合聚合函數&#xff0c;利用分組信息進行統計&#xff0c;語句如“select name,sum(id) from test group by name,number”。 先來看下表1&#xff0c;表名為test&#xff1a; 執行如下SQL語句&#xff1a; SELECT name FROM test GROUP BY name 你…

OFDM802.11a的FPGA實現(十四)data域的設計優化,擠掉axi協議傳輸中的氣泡

原文鏈接&#xff08;相關文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA實現 目錄 1.前言 2.data域的時序要求 3.Debug 1.前言 前面12篇文章詳細講述了&#xff0c;OFDM 802.11a發射部分data域的FPGA實現和驗證&#xff0c;今天對data域的設計做一個總結。在…

electron 多窗口 vuex/pinia 數據狀態同步簡易方案(利用 LocalStorage)

全局 stroe 添加 mutations 狀態同步方法 // 用于其他窗口同步 vuex 中的 DeviceTcpDataasyncDeviceTcpData(state: StateType, data: any) {state.deviceTcpData data},App.vue 里 onMounted(() > {console.log("App mounted");/*** vuex 多窗口 store 同步*//…

springboot306基于Java的民宿管理系統(源碼+包運行+配套LW+技術指導)

項目描述 臨近學期結束&#xff0c;開始畢業設計制作&#xff0c;你還在做java程序網絡編程&#xff0c;期末作業&#xff0c;老師的作業要求覺的困難嗎?不知道畢業設計該怎么辦?網頁功能的數量是否太多?沒有合適的類型或系統?等等。今天給大家介紹一篇基于Java的民宿管理…

python篇-cmd 執行pip命令失敗,但執行pyhon命令正常

當你在CMD中可以正常執行python命令&#xff0c;但執行pip命令失敗時&#xff0c;這通常意味著pip沒有被正確地添加到系統的環境變量中。這里有一些步驟來解決這個問題&#xff1a; 檢查環境變量&#xff1a; 打開系統的環境變量設置&#xff08;右擊“此電腦”>“屬性”>…

CoSeg: Cognitively Inspired Unsupervised Generic Event Segmentation

名詞解釋 1.特征重建 特征重建是一種機器學習中常用的技術&#xff0c;通常用于自監督學習或無監督學習任務。在特征重建中&#xff0c;模型被要求將輸入數據經過編碼器&#xff08;encoder&#xff09;轉換成某種表示&#xff0c;然后再經過解碼器&#xff08;decoder&#x…

c/c++對于char*的理解(聯合string容器)

在C和C中&#xff0c;char*是一個指向字符&#xff08;char&#xff09;的指針。它經常被用來處理C風格的字符串&#xff0c;這種字符串是以空字符&#xff08;\0&#xff09;結尾的字符數組。以下是關于char*的一些關鍵點&#xff1a; C風格的字符串&#xff1a; C風格的字符…