數據結構與算法學習筆記三---循環隊列的表示和實現(C語言)

目錄

前言

1.為啥要使用循環隊列

2.隊列的順序表示和實現

1.定義

2.初始化

3.銷毀

4.清空

5.空隊列

6.隊列長度

7.獲取隊頭

8.入隊

9.出隊

?10.遍歷隊列

11.完整代碼


前言

? ? 本篇博客介紹棧和隊列的表示和實現。

1.為啥要使用循環隊列

? ? 上篇文章中我們知道了順序隊列的用法,但是順序隊列有個缺點就是會“假溢出”,浪費大量的存儲空間,關于假溢出的問題,個人感覺數據結構里里面的這段解釋比較好,就直接截圖放下面了,大家自行閱讀吧。

圖1.順序隊列假溢出的問題

2.隊列的順序表示和實現

1.定義

#define MAX_QUEUE_SIZE 100 // 循環隊列的最大容量typedef int Status;
typedef int ElemType;typedef struct {ElemType *data; // 存儲數據的數組int front;      // 頭指針,指向隊首元素int rear;       // 尾指針,指向隊尾元素的下一個位置int maxSize;    // 循環隊列的最大容量
} CircularQueue;

2.初始化

? ? ? ? 隊列初始化的時候,隊頭和隊尾指針均為0

// 初始化循環隊列
Status initCircularQueue(CircularQueue *queue, int maxSize) {queue->data = (ElemType *)malloc(sizeof(ElemType) * maxSize);if (!queue->data) {return 0; // 內存分配失敗}queue->front = queue->rear = 0;queue->maxSize = maxSize;return 1; // 初始化成功
}

3.銷毀

? ? ? ? ? 釋放隊列存儲空間

// 銷毀循環隊列
void destroyCircularQueue(CircularQueue *queue) {free(queue->data);
}

4.清空

// 清空循環隊列
void clearCircularQueue(CircularQueue *queue) {queue->front = queue->rear = 0;
}

5.空隊列

? ? ? ? 隊頭和隊尾相同的時候為空隊列。

// 判斷循環隊列是否為空
Status isEmptyCircularQueue(CircularQueue *queue) {return queue->front == queue->rear;
}

6.隊列長度

? ? ? ? 比較棧頂和棧頂的指針

// 獲取循環隊列長度
int circularQueueLength(CircularQueue *queue) {return (queue->rear - queue->front + queue->maxSize) % queue->maxSize;
}

7.獲取隊頭

? ? ? ? 獲取隊頭元素。

// 獲取循環隊列的隊首元素
Status getCircularQueueFront(CircularQueue *queue, ElemType *element) {if (isEmptyCircularQueue(queue)) {return 0; // 隊列為空}*element = queue->data[queue->front];return 1; // 成功獲取隊首元素
}

8.入隊

// 入隊
Status enCircularQueue(CircularQueue *queue, ElemType element) {if ((queue->rear + 1) % queue->maxSize == queue->front) {return 0; // 隊列已滿}queue->data[queue->rear] = element;queue->rear = (queue->rear + 1) % queue->maxSize;return 1; // 入隊成功
}

9.出隊

// 出隊
Status deCircularQueue(CircularQueue *queue, ElemType *element) {if (isEmptyCircularQueue(queue)) {return 0; // 隊列為空}*element = queue->data[queue->front];queue->front = (queue->front + 1) % queue->maxSize;return 1; // 出隊成功
}

?10.遍歷隊列

// 遍歷循環隊列
void traverseCircularQueue(CircularQueue *queue) {for (int i = queue->front; i != queue->rear; i = (i + 1) % queue->maxSize) {printf("%d ", queue->data[i]);}printf("\n");
}

11.完整代碼

int main(int argc, const char *argv[]) {CircularQueue queue;int maxSize = 10; // 循環隊列的最大容量initCircularQueue(&queue, maxSize); // 初始化循環隊列// 測試入隊for (int i = 1; i <= 5; ++i) {enCircularQueue(&queue, i * 10);}// 輸出隊列元素printf("隊列元素:");traverseCircularQueue(&queue);// 獲取隊首元素ElemType frontElement;if (getCircularQueueFront(&queue, &frontElement)) {printf("隊首元素:%d\n", frontElement);}// 測試出隊ElemType element;for (int i = 0; i < 3; ++i) {if (deCircularQueue(&queue, &element)) {printf("出隊元素:%d\n", element);}}// 輸出隊列元素printf("隊列元素:");traverseCircularQueue(&queue);// 判斷隊列是否為空if (isEmptyCircularQueue(&queue)) {printf("隊列為空\n");} else {printf("隊列不為空\n");}// 獲取隊列長度printf("隊列長度:%d\n", circularQueueLength(&queue));// 清空隊列clearCircularQueue(&queue);// 判斷隊列是否為空if (isEmptyCircularQueue(&queue)) {printf("清空隊列后,隊列為空\n");} else {printf("清空隊列后,隊列不為空\n");}// 銷毀隊列destroyCircularQueue(&queue);return 0;
}

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

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

相關文章

Hive Transaction事務表(含實現原理)

Hive Transaction事務表 在Hive中&#xff0c;事務表&#xff08;Transactional Tables&#xff09;允許用戶執行事務性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔離性、持久性&#xff09;特性。事務表是在Hive 0.14版本引入的&#xff0c;并且在后續版本中不斷…

LabVIEW天然氣壓縮因子軟件設計

LabVIEW天然氣壓縮因子軟件設計 項目背景 天然氣作為一種重要的能源&#xff0c;其壓縮因子的準確計算對于流量的計量和輸送過程的優化具有關鍵意義。傳統的計算方法不僅步驟繁瑣&#xff0c;而且難以滿足現場快速響應的需求。因此&#xff0c;開發一款既能保證計算精度又便于…

使用Pandas對Data列進行基于順序的分組排列

目錄 一、引言 二、Pandas庫簡介 三、按照數據列中元素出現的先后順序進行分組排列 四、案例分析 五、技術細節探討與擴展應用 1. 技術細節 2. 擴展應用 3. 示例代碼&#xff1a;用戶行為分析 4. 進階應用&#xff1a;分組后的聚合操作 5. 分組后的數據篩選 6. 分組…

【DevOps】Linux 安全:iptables 組成、命令及應用場景詳解

導讀&#xff1a;全面掌握 iptables&#xff1a;從基礎到實踐 在 Linux 系統中&#xff0c;iptables 是一個非常強大的工具&#xff0c;它不僅是系統管理員用來構建和管理網絡防火墻的首選工具&#xff0c;而且也是一個功能豐富的網絡流量處理系統。無論是進行包過濾、監控網絡…

學習筆記:【QC】Android Q qmi擴展nvReadItem/nvWriteItem

一、qmi初始化 流程圖 初始化流程: 1、主入口&#xff1a; vendor/qcom/proprietary/qcril-hal/qcrild/qcrild/rild.c int main(int argc, char **argv) { const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **); rilInit RIL_Init; funcs rilInit…

孩子通過編程可以收獲什么?

編程是一種高度創造性的活動&#xff0c;它可以幫助孩子們培養出許多有價值的技能和品質。通過學習編程&#xff0c;孩子們可以收獲以下幾點&#xff1a; 邏輯思維能力 編程是一種需要嚴密的邏輯思維和分析能力的活動。在編程過程中&#xff0c;孩子們需要理清思路&#xff0c;…

李彥宏回顧大模型重構百度這一年

“大模型我們走在最前面&#xff0c;我們需要去勇闖無人區&#xff0c;需要去冒前人沒有冒過的風險。”近日&#xff0c;在百度一場內部頒獎活動中&#xff0c;百度創始人、董事長兼首席執行官李彥宏指出&#xff0c;百度一直堅信技術可以改變世界&#xff0c;會一直沿著這條路…

docker的centos容器使用yum報錯

錯誤描述 學習docker過程中&#xff0c;基于 centos 鏡像自定義新的鏡像。拉取一個Centos鏡像&#xff0c;并運行容器&#xff0c;容器安裝vim&#xff0c;報錯了。 報錯&#xff1a;Error: Failed to download metadata for repo appstream: Cannot prepare internal mirror…

python視頻轉碼腳本

今天有一個臨時的需求&#xff0c;就是需要將一個wmv的初步轉碼成mp4的格式。找了一圈&#xff0c;免費的工具少&#xff0c;即使有免費的工具&#xff0c;在功能上也是有所限制&#xff0c;或者會給你塞廣告或者附帶安裝其它流氓小游戲或者殺毒程序。 我并非不支持正版&#…

C++面向對象學習筆記五

本文主要講解運算符重載&#xff0c;由于白鳯大佬沒有具體講解&#xff0c;所以本文自行補充了運算符重載的相關知識 目錄 文章目錄 前言 運算符重載 加號運算符重載 左移運算符重載 遞增運算符重載 總結 前言 本文主要對于運算符重載進行探討&#xff0c;分別對于成員函數重…

JVM 類加載機制

JVM 類加載機制分為五個部分&#xff1a;加載&#xff0c;驗證&#xff0c;準備&#xff0c;解析&#xff0c;初始化&#xff0c;下面我們就分別來看一下這五個過程。 加載 加載是類加載過程中的一個階段&#xff0c;這個階段會在內存中生成一個代表這個類的 java.lang.class 對…

C語言經典例題-9

1.簡單計算器 題目描述&#xff1a; KK實現一個簡單計算器&#xff0c;實現兩個數的“加減乘除”運算&#xff0c;用戶從鍵盤輸入算式“操作數1運算符操作數2”&#xff0c;計算并輸出表達式的值&#xff0c;如果輸入的運算符號不包括在&#xff08;、-、*、/&#xff09;范圍…

Navicat Premium安裝pojie版

下載、安裝mysql&#xff0c;環境變量配置 1、官網下載mysql&#xff1a;https://www.mysql.com/downloads/ 下載成功&#xff0c;進行安裝 一直點下一步 驗證&#xff0c;開始中搜索mysql 說明安裝成功 環境變量配置 默認安裝路徑C:\Program Files\MySQL …

向量檢索和關鍵字檢索的區別?

向量檢索&#xff08;Vector Retrieval&#xff09;和關鍵字檢索&#xff08;Keyword Retrieval&#xff09;是信息檢索領域中常見的兩種檢索方法&#xff0c;它們有一些顯著的區別&#xff1a; 1、檢索方式&#xff1a; 向量檢索&#xff1a;向量檢索是基于文檔和查詢之間的相…

Kafka和Spark Streaming的組合使用學習筆記(Spark 3.5.1)

一、安裝Kafka 1.執行以下命令完成Kafka的安裝&#xff1a; cd ~ //默認壓縮包放在根目錄 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、啟動Kafaka 1.首先需要啟動K…

計算機畢業設計Python地震預測系統 地震數據分析可視化 地震爬蟲 大數據畢業設計 Flink Hadoop 深度學習 機器學習 人工智能 知識圖譜

學生信息 姓名&#xff1a;  祁浩 題目&#xff1a; 基于Python的中國地震數據分析與可視化系統的設計與實現 學號&#xff1a; 2020135211 班級&#xff1a; 20大數據本科2班 指導教師&#xff1a; 劉思思 答辯過程 學生開題陳述 為了讓學習者更好的了解了解地震…

Coze扣子開發指南:AI零代碼編程創建插件

在Coze扣子中創建插件&#xff0c;有兩種方式&#xff0c;一是用API&#xff0c;具體方式參照上一篇文章《Coze扣子開發指南&#xff1a;用免費API自己創建插件》&#xff0c;還有一種方式就是編程&#xff0c;不過有了AI的幫助&#xff0c;即使不會編程的人&#xff0c;也可以…

HarmonyOS開發案例:【生活健康app之獲取成就】(3)

獲取成就 本節將介紹成就頁面。 功能概述 成就頁面展示用戶可以獲取的所有勛章&#xff0c;當用戶滿足一定的條件時&#xff0c;將點亮本頁面對應的勛章&#xff0c;沒有得到的成就勛章處于熄滅狀態。共有六種勛章&#xff0c;當用戶連續完成任務打卡3天、7天、30天、50天、…

用大于meilisearch-java-0.7.0.jar的報錯的解決

Elasticsearch 做為老牌搜索引擎&#xff0c;功能基本滿足&#xff0c;但復雜&#xff0c;重量級&#xff0c;適合大數據量。 MeiliSearch 設計目標針對數據在 500GB 左右的搜索需求&#xff0c;極快&#xff0c;單文件&#xff0c;超輕量。 所以&#xff0c;對于中小型項目來說…

阿里云服務器在線安裝nginx

??個人主頁: 蒾酒 &#x1f525;系列專欄&#xff1a;《nginx實戰》 目錄 內容簡介 安裝步驟 1.root用戶登錄連接阿里云服務器 2.在usr/local下新建nginx目錄 3.安裝 1安裝下載工具 2下載nginx壓縮包 3解壓 4安裝nginx依賴的庫 5編譯并安裝 6啟動nginx 7開啟…