數據結構之隊列(C語言)

1.隊列的定義:

隊列(Queue)是一種基礎且重要的線性數據結構,遵循先進先出(FIFO)?? 原則,即最早入隊的元素最先出隊,與棧不同的是出隊列的順序是固定的。隊列具有以下特點:

  1. ?FIFO原則?:元素按插入順序處理,隊頭(Front)刪除,隊尾(Rear)插入。
  2. ?操作受限?:僅允許在兩端操作(隊尾入隊、隊頭出隊),中間元素不可直接訪問
  3. 順序隊列(數組實現)??
    - ?優點?:內存連續,訪問高效。
    - ?缺點?:易“假溢出”(數組未滿但指針越界),需通過循環隊列優化:
    - 隊尾指針循環:rear = (rear + 1) % size
    - 隊滿條件:(rear + 1) % size == front(犧牲一個存儲單元)。
    ?鏈式隊列(鏈表實現)??
    - ?優點?:動態擴容,無固定大小限制

2. 隊列的實現:

首先我們打開visual studio,我們需要準備以下界面:
在這里插入圖片描述

2.1 queue.h代碼

其中queue.h主要是存放函數的調用的頭文件,內容如下:

#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
#define QDataType int struct QueueNode 
{QDataType data;struct QueueNode* next;//定義 next指針//我們可以嘗試使用單鏈表來完成 
};
typedef struct QueueNode QNode;struct queue
{QNode* phead;QNode* ptail;int size;//為什么需要通過結構體來封裝兩個指針//原本需要通過二級指針來完成增加和刪除
};
typedef struct queue queue;
//上述完成結構體基本建設//接下來完成以下接口:
//初始化和銷毀
void QueueInit(queue* pq);
void QueueDestroy(queue* pq);//后增和前刪
void QueuePush(queue* pq, QDataType x);
void QueuePop(queue* pq);//取出之前的數和取出后面的數 
QDataType QueueFront(queue* pq);
QDataType QueueBack(queue* pq);//返回隊列中有效值個數
int QueueSize(queue* pq);//判空
bool QueueEmpty(queue* pq);

這一塊代碼是棧的頭文件,我們給出接口,接下來我們要嘗試在stack.c里面實現這些代碼,即這些頭文件的接口具體如何實現

1.2 queue.c代碼

#include"queue.h"void QueueInit(queue* pq)
{pq->phead = pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(queue* pq)
{QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;
}void QueuePush(queue* pq, QDataType x)
{QNode* tmp = (QNode*)malloc(sizeof(QNode));if (tmp == NULL){perror("malloc fail");return;}tmp->data = x;tmp->next = NULL;if (pq->phead == NULL){//如果沒有初始化pq->phead = tmp;pq->ptail = tmp;pq->size++;}else {pq->ptail->next = tmp;pq->ptail = tmp;pq->size++;}
}void QueuePop(queue* pq)
{assert(pq);QNode* Pop = pq->phead;pq->phead = pq->phead->next;free(Pop);pq->size--;
}QDataType QueueFront(queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->data;
}QDataType QueueBack(queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->data;
}int QueueSize(queue* pq)
{assert(pq);return pq->size;
}bool QueueEmpty(queue* pq)
{assert(pq);return pq->size == 0;
}

我們通過編寫依次完成了這些代碼的編寫。我們接下來測試這些代碼是否正常源代碼如下:

#include"queue.h"void test1(queue* pq)
{QueueInit(pq);QueuePush(pq,1);QueuePop(pq);QueuePush(pq, 1);QueuePush(pq, 2);QueuePush(pq, 3);printf("%d ", QueueBack(pq));printf("%d ", QueueFront(pq));printf("%d",  QueueSize(pq));QueueDestroy(pq);
}int main()
{queue q1;test1(&q1);
}

嘗試利用代碼來調試看看我們完成的接口是否有問題:
在這里插入圖片描述

目前來看是沒有問題的。

3 總結:

隊列以其嚴格的FIFO特性和高效的操作,成為管理有序任務的理想工具。理解其實現差異(循環隊列 vs 鏈式隊列)和應用場景(調度、緩沖、BFS等),能顯著提升系統設計能力。實際開發中需根據數據規模?(靜態/動態)、性能需求?(時間/空間復雜度)和并發環境選擇合適的實現方式

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

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

相關文章

C#開發基礎之深入理解“集合遍歷時不可修改”的異常背后的設計

前言 歡迎關注【dotnet研習社】&#xff0c;今天我們聊聊一個基礎問題“集合已修改&#xff1a;可能無法執行枚舉操作”背后的設計。 在日常 C# 開發中&#xff0c;我們常常會操作集合&#xff08;如 List<T>、Dictionary<K,V> 等&#xff09;。一個新手開發者極…

【工具】圖床完全指南:從選擇到搭建的全方位解決方案

前言 在數字化內容創作的時代&#xff0c;圖片已經成為博客、文檔、社交媒體等平臺不可或缺的元素。然而&#xff0c;如何高效、穩定地存儲和分發圖片資源&#xff0c;一直是內容創作者面臨的重要問題。圖床&#xff08;Image Hosting&#xff09;作為專門的圖片存儲和分發服務…

深度學習篇---PaddleDetection模型選擇

PaddleDetection 是百度飛槳推出的目標檢測開發套件&#xff0c;提供了豐富的模型庫和工具鏈&#xff0c;覆蓋從輕量級移動端到高性能服務器的全場景需求。以下是核心模型分類、適用場景及大小選擇建議&#xff08;通俗易懂版&#xff09;&#xff1a;一、主流模型分類及適用場…

cmseasy靶機密碼爆破通關教程

靶場安裝1.首先我們需要下載一個cms靶場CmsEasy_7.6.3.2_UTF-8_20200422,下載后解壓在phpstudy_pro的網站根目錄下。2.然后我們去訪問一下安裝好的網站&#xff0c;然后注冊和鏈接數據庫3.不知道自己數據庫密碼的可以去小皮面板里面查看4.安裝好后就可以了來到后臺就可以了。練…

【C語言】指針深度剖析(一)

文章目錄一、內存和地址1.1 內存的基本概念1.2 編址的原理二、指針變量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指針變量和解引用操作符&#xff08;*&#xff09;2.2.1 指針變量2.2.2 指針類型的解讀2.2.3 解引用操作符2.3 指針變量的大小三、指針變量類型的…

半導體企業選用的跨網文件交換系統到底應該具備什么功能?

在半導體行業的數字化轉型過程中&#xff0c;跨網文件交換已成為連接研發、生產、供應鏈的關鍵紐帶。半導體企業的跨網文件交換不僅涉及設計圖紙、工藝參數等核心知識產權&#xff0c;還需要滿足跨國協同、合規審計等復雜需求。那么&#xff0c;一款適合半導體行業的跨網文件交…

影刀RPA_初級課程_玩轉影刀自動化_網頁操作自動化

聲明&#xff1a;相關內容來自影刀學院&#xff0c;本文章為自用筆記&#xff0c;切勿商用&#xff01;&#xff08;若有侵權&#xff0c;請聯絡刪除&#xff09; 1. 基本概念與操作 1.1 正確處理下拉框元素&#xff08;先判斷頁面元素&#xff0c;后進行流程編制&#xff09;…

Spark初探:揭秘速度優勢與生態融合實踐

更多推薦閱讀 Spark與Flink深度對比&#xff1a;大數據流批一體框架的技術選型指南-CSDN博客 LightProxy使用操作手冊-CSDN博客 Sentry一看就會教程_sentry教程-CSDN博客 微前端架構解析&#xff1a;核心概念與主流方案特性對比_微前端方案對比-CSDN博客 目錄 Spark為何比Hadoo…

詳談OSI七層模型和TCP/IP四層模型以及tcp與udp為什么是4層,http與https為什么是7層

一、網絡模型&#xff1a;OSI七層 vs TCP/IP四層OSI七層模型 (理論參考模型):目的&#xff1a;提供一個標準化的理論框架&#xff0c;用于理解網絡通信過程和各層的功能劃分&#xff0c;促進不同廠商設備的互操作性。它是一個理想化的模型。分層 (從下到上):物理層&#xff1a;…

ClickHouse 高性能實時分析數據庫-索引與數據跳過(查詢的“瞬移”能力)

告別等待&#xff0c;秒級響應&#xff01;這不只是教程&#xff0c;這是你駕馭PB級數據的超能力&#xff01;我的ClickHouse視頻課&#xff0c;凝練十年實戰精華&#xff0c;從入門到精通&#xff0c;從單機到集群。點開它&#xff0c;讓數據處理速度快到飛起&#xff0c;讓你…

Jetpack - Room(Room 引入、Room 優化)

一、Room 引入 1、基本介紹 Room 在 SQLite 上提供了一個抽象層&#xff0c;以便在充分利用 SQLite 的強大功能的同時&#xff0c;能夠流暢地訪問數據庫&#xff0c;官方強烈建議使用 Room 而不是 SQLite 2、演示 &#xff08;1&#xff09;Setting 模塊級 build.gradle depend…

【江科大CAN】2.1 STM32 CAN外設(上)

2.1 STM32 CAN外設&#xff08;上&#xff09;2.1.1 STM32 CAN外設簡介2.1.2 外圍電路設計2.1.3 STM32 CAN內部結構2.1.4 發送流程詳解2.1.5 接收流程詳解2.1.6 關鍵配置位總結STM32 CAN外設講解 大家好&#xff0c;歡迎繼續觀看CAN總線入門教程。本節開始&#xff0c;我們正式…

人工智能技術革命:AI工具與大模型如何重塑開發者工作模式與行業格局

引言&#xff1a;AI技術爆發的時代背景過去五年間&#xff0c;人工智能領域經歷了前所未有的爆發式增長。從2020年GPT-3的橫空出世到2023年多模態大模型的全面突破&#xff0c;AI技術已經從實驗室走向了產業應用的前沿。開發者作為技術生態的核心推動者&#xff0c;其工作模式正…

傅里葉變換

傅里葉變換:運用頻域的出發點就是能夠將波形從時域變換到頻域&#xff0c;用傅里葉變換可以做到這一點。有如下3種傅里葉變換類型&#xff1a;1.傅里葉積分(FI); 2.離散傅里葉變換(DFT); 3.快速傅里葉變換(FFT)。傅里葉積分是一種將時域的理想數學表達變換成頻域描述的數學技術…

【IQA技術專題】紋理相似度圖像評價指標DISTS

紋理一致性圖像評價指標: Image Quality Assessment: Unifying Structure and Texture Similarity&#xff08;2020 PAMI&#xff09;專題介紹一、研究背景二、方法總覽2.1 初始變換2.2 紋理表示和結構表示2.3 DISTS指標2.4 優化DISTS指標三、實驗結果四、總結本文將對統一圖像…

windows下Docker安裝路徑、存儲路徑修改

一、命令行指定安裝路徑? ??下載安裝包??&#xff1a;從Docker官網獲取安裝程序&#xff08;如Docker Desktop Installer.exe&#xff09;。??運行PowerShell??&#xff1a; & "H:\Docker Desktop Installer.exe" install --installation-dir"F:…

thingsboard 自定義動作JS編程

在 ThingsBoard 中實現 自定義動作&#xff08;Custom Action&#xff09;的 JavaScript 編程&#xff0c;主要通過“Custom action (with HTML template&#xff09;”方式完成&#xff0c;適用于創建彈窗、編輯實體、控制設備等交互行為。 實現步驟&#xff08;以添加設備或資…

Spring Boot 簡單接口角色授權檢查實現

一、背景與目標在Spring Boot應用開發中&#xff0c;接口級別的權限控制是系統安全的重要組成部分。本文將介紹一種簡單直接的接口角色授權檢查實現方案&#xff0c;適合快速開發和安全合規檢查場景。二、技術方案概述本方案采用自定義注解攔截器的方式實現&#xff0c;具有以下…

PytorchLightning最佳實踐日志篇

在 PyTorch Lightning&#xff08;PL&#xff09;中&#xff0c;日志系統是 “煉丹” 過程中復現實驗、對比效果、排查問題的核心工具。結合實際工程經驗&#xff0c;總結以下最佳實踐和技巧&#xff0c;幫助提升實驗效率&#xff1a; 一、日志工具的選擇與配置 PL 通過統一的s…

基于JavaWeb的兼職發布平臺的設計與實現

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.6系統展示系統首頁用戶登錄招聘信…