【數據結構】隊列及其實現

目錄

1.隊列的概念及結構

2.隊列的實現

2.1隊列結構定義?

2.2隊列的初始化及銷毀

2.3數據入隊

2.4數據出隊

2.5訪問隊頭數據

2.6訪問隊尾數據

2.6判斷隊列是否為空

2.7求隊列的大小

2.7打印隊列?


1.隊列的概念及結構

隊列:只允許在一端進行插入數據操作,另一端進行刪除數據操作的特殊線性表

隊列中先進先出FIFO(First In First Out)

入隊列:進行插入操作的一端稱為隊尾

出隊列:進行刪除操作的一端稱為隊頭

2.隊列的實現

隊列結構可以使用數組和鏈表結構實現,但一般采用的是鏈表,因為對于數組結構,隊頭出數據的效率較低

2.1隊列結構定義?

使用鏈表實現隊列,隊列中的每個元素都是節點的形式,所以需要定義節點的結構

對于隊列,其具有隊尾入數據,隊頭出數據的特性,所以其結構定義需要兩個指針,分別指向隊頭和隊尾

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;
}Queue;

2.2隊列的初始化及銷毀

初始化即隊列為空隊列,隊頭指針和隊尾指針都指向空

銷毀隊列,即釋放隊列中所有節點的空間,隊頭指針和隊尾指針重新指向空

//隊列初始化
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;
}
//隊列銷毀
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* del = cur;cur = cur->next;free(del);}pq->head = pq->tail = NULL;
}

2.3數據入隊

隊列結構中,數據入隊從隊尾入,需要考慮空隊列和非空隊列兩種情況

1??空隊列:

2??非空隊列:

?空隊列和非空隊列不同的是空隊列插入數據時需要更新隊頭指針

//數據入隊
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}else{newnode->data = x;newnode->next = NULL;}//空隊列時插入if (pq->tail == NULL){pq->head = pq->tail = newnode;}//非空隊列時插入else{pq->tail->next = newnode;//鏈接新元素pq->tail = newnode;//更新隊尾}
}

2.4數據出隊

隊列結構中,數據出隊從隊頭出,對于空隊列,出隊操作非法

出隊操作后,需要更新隊頭指針,并釋放已出隊節點的空間

特殊情況:隊列中只有一個節點

//數據出隊
void QueuePop(Queue* pq)
{assert(pq);//空隊列不能進行出隊操作assert(!QueueEmpty(pq));//隊列中只有一個元素if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* del = pq->head;pq->head = pq->head->next;free(del);del = NULL;}
}

2.5訪問隊頭數據

隊頭數據的訪問操作在隊列為空時非法,所以需要先斷言,非空鏈表才可以進行隊頭數據的訪問操作,通過隊頭指針訪問即可

//訪問隊頭數據
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;}

2.6訪問隊尾數據

隊尾數據的訪問操作在隊列為空時非法,所以需要先斷言,非空鏈表才可以進行隊尾數據的訪問操作,通過隊尾指針訪問即可

//訪問隊尾數據
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

2.6判斷隊列是否為空

隊列為空則隊頭指針和隊尾指針都指向空,可以使用if-else語句進行返回

也可以參考以下代碼,直接返回pq->head == NULL && pq->tail == NULL,只有當pq->head和pq->tail同時為NULL是才返回真,即隊列為空

📖Note:

判空函數的返回類型為bool,但是C語言標準中沒有bool類型,所以需要我們自己定義

#define bool int
//判斷隊列是否為空
bool QueueEmpty(Queue* pq)
{assert(pq);/*if (pq->tail == pq->head == NULL){return true;}else{return false;}*/return pq->head == NULL && pq->tail == NULL;
}

2.7求隊列的大小

求隊列的大小,遍歷統計節點個數并返回即可

//求隊列的大小
int QueueSize(Queue* pq)
{assert(pq);int size = 0;QNode* cur = pq->head;while (cur){size++;cur = cur->next;}return size;
}

2.7打印隊列?

為了便于觀察入隊與出隊操作,可以編寫一個打印函數便于調試

//打印隊列
void QueuePrint(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}

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

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

相關文章

ECMAScript 2023(ES14)中的所有新功能

?JavaScript在持續發展,近期ECMAScript 14中發布添加了一批新功能,讓我們一起來探索一下今年對JavaScript開發人員的新功能。時間的車輪又過去了一年,隨之而來的是JavaScript的新官方版本:ECMAScript 2023,也被稱為EC…

與微服務平臺廠家聯手,一起實現高效率發展!

在如今的快節奏發展社會中,只有利用科技的力量,才能與市場接軌,了解市場和客戶需求,最終實現更快速的發展。如果還停留在閉門造車的環境中,不“引進來,走出去”,那勢必會與成功擦肩而過。微服務…

clickHouse部署

docker倉庫地址 https://hub.docker.com/ 1、docker環境搭建 # 1.先安裝yml yum install -y yum-utils device-mapper-persistent-data lvm2 # 2.設置阿里云鏡像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查…

【芯片前端】auto_testbench的大版本升級——加入簡單預期與自動比對

前言 前文提要: 【芯片前端】一鍵生成簡易版本定向RTL驗證環境的腳本——auto_verification_rtl腳本_尼德蘭的喵的博客-CSDN博客 【芯片前端】可能是定向驗證的巔峰之作——auto_testbench_autotestbench_尼德蘭的喵的博客-CSDN博客 工具路徑: auto…

廣告聚合平臺能為APP開發者提供哪些幫助

應用變現平臺是幫助開發者優化廣告策略并最終獲得更多收入的綜合途徑。在廣告變現過程中,接入單一的廣告聯盟,變現效率不高,并且開發者需要花費許多精力進行篩選和管理,難免會應接不暇,而聚合廣告平臺的出現則一定程度…

GloVe、子詞嵌入、BPE字節對編碼、BERT相關知識(第十四次組會)

GloVe、子詞嵌入、BPE字節對編碼、BERT相關知識(第十四次組會) Glove子詞嵌入上游、下游任務監督學習、無監督學習BERTGlove 子詞嵌入 上游、下游任務 監督學習、無監督學習 BERT

springboot使用configtree讀取樹形文件目錄中的配置

文章目錄 一、介紹二、演示環境三、項目演示1. 配置文件2. 導入配置3. 檢測配置屬性 四、應用場景五、源碼解析1. ConfigTreeConfigDataLocationResolver2. ConfigTreeConfigDataLoader 六、總結 一、介紹 相信絕大多數使用springboot開發項目的朋友們在添加配置時&#xff0c…

【從零學習python 】23. Python中集合(set)的使用方法和常見操作

文章目錄 set的使用創建格式添加元素移除元素set常見方法列表練習 進階案例 set的使用 集合(set)是一個無序的不重復元素序列,可以使用大括號 { } 或者 set() 函數創建集合。 注意:創建一個空集合必須用 set() 而不是 { }&#x…

母嬰即時零售行業數據可視化分析

對新晉父母來說,很多母嬰用品如同一位貼心的助手,為他們的寶寶提供溫暖和呵護。從嬰兒床墊到可愛的拼圖玩具,每一件用品都是為寶寶的成長和發展量身定制。對于繁忙的父母們而言,這些用品不僅幫助照顧孩子,更是為他們減…

一百五十一、Kettle——Linux上安裝的kettle8.2開啟carte服務以及配置子服務器

一、目的 kettle8.2在Linux上安裝好可以啟動界面、并且可以連接MySQL、Hive、ClickHouse等數據庫后,準備在Linux上啟動kettle的carte服務 二、實施步驟 (一)carte服務文件路徑 kettle的Linux運行的carte服務文件是carte.sh (二…

手機兩個卡槽的正確使用方法,您用對了嗎?

手機上有兩個卡槽,該如何搭配才能使話費降到最低?你又是怎么搭配的? 這篇文章小編就來告訴你,如何在不換號的情況下,將自己的話費降到最低。 首先卡槽一我們就用8元保號套餐。 卡槽二,我們就可以辦理一張…

【C語言】每日一題(尋找數組的中心下標)

尋找數組的中心下標,鏈接奉上 方法 暴力循環前綴和 暴力循環 ???????思路: 依舊是我們的老朋友,暴力循環。 1.可以利用外層for循環,循環變量為數組下標,在循環內分別求出下標左邊與右邊的sum 2.在邊界時討論&…

JAVA 鼠標控制與鍵盤輸入控制

核心類:java.awt.Robot 該類是JDK定義的電腦系統的抽象類,可以用來模擬實現鼠標點擊與鍵盤輸入等信息 簡單實現一個自動搶票代碼: Robot rt new Robot();//可以認為是操作間隔的停歇時間,比如等待頁面加載,等彈框內容展示等 r…

vue tree禁用和多選變為單選

禁用的話和后臺協調一下&#xff0c;參數中多返回一個disabled 多選變單選 在tree結構中加入一個方法 <el-treeaccordion:data"deptOptions":props"defaultProps"show-checkbox:expand-on-click-node"false":filter-node-method"filte…

windows bat 腳本實現FTP自動下載上傳

windows bat 腳本實現FTP自動下載上傳 1. 自動下載 # 示例&#xff1a;實現自動下載 echo Off echo open 192.168.137.102>>ftp.txt echo admin>>ftp.txt echo admin12345>>ftp.txt echo lcd D:\>>ftp.txt echo cd /admin/1>>ftp.txt echo bin…

k8s整合istio配置gateway入口、配置集群內部服務調用管理

一、 istio gateway使用demo kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: ngdemo-gatewaynamespace: ssx spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:numbe…

碼銀送書第五期《互聯網廣告系統:架構、算法與智能化》

廣告平臺的建設和完善是一項長期工程。例如&#xff0c;谷歌早于2003年通過收購Applied Semantics開展Google AdSense 項目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示廣告平臺仍在持續創新和提升。廣告平臺是負有營收責任的復雜在線平臺&#xff0c;對其進行任何改動…

Mysql—修改用戶密碼(重置密碼)

Mysql—修改用戶密碼&#xff08;重置密碼&#xff09; 1、登錄mysql 1 2 [rootlocalhost ~]# mysql -uroot -p123456 [rootlocalhost ~]# mysql -hlocalhost -uroot -p123456 如果忘記密碼&#xff0c;則跳過MySQL的密碼認證過程。步驟如下&#xff1a; 修改Mysql配置文件…

TypeScript教程(三)變量聲明

一、變量聲明 變量是一種使用方便的占位符&#xff0c;用于引用計算機內存地址&#xff0c;可以將變量看做存儲數據的容器 命名規則&#xff1a; 1.變量名稱可以包含數字和字母 2.除了下劃線_和美元$符號外&#xff0c;不能包含其他特殊字符&#xff0c;包括空格 3.變量名…

使用GUI Guider工具在MCU上開發嵌入式GUI應用 (1) - GUI Guider簡介及安裝

使用GUI Guider工具在MCU上開發嵌入式GUI應用 (1) - GUI Guider簡介及安裝 受限于每篇文章最多只能貼9張圖的限制&#xff0c;這個教程被拆分成了多篇文章連載發布&#xff0c;完整目錄結構如下圖x所示。后續會發布完整教程的pdf文件&#xff0c;敬請期待。 圖x 完整教程文檔…