「數據結構」隊列

目錄

隊列的基本概念

隊列的實現

頭文件queue.h

實現函數接口

1.初始化和銷毀

2.出隊列和入隊列

3.獲取隊頭元素和隊尾元素

4.隊列長度+判空

后記


前言

歡迎大家來到小鷗的博客~

個人主頁:海盜貓鷗

本篇專題:數據結構

多謝大家的支持啦!

上一篇關于數據結構的博客中我們講解了棧,本篇我們就來講講隊列吧!

隊列的基本概念

  1. 隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出 FIFO(First In First Out)
  2. 入隊列:進行插入操作的一端稱為隊尾
  3. 出隊列:進行刪除操作的一端稱為隊頭

隊列也可以數組和鏈表的結構實現,使用鏈表的結構實現更優一些,因為如果使用數組的結構,出隊列在數組頭上出數據,效率會比較低。

如果使用數組,每次出隊列之后,都需要移動數據,消耗較大。

所以本篇使用單鏈表實現隊列,因為頭刪和尾插剛好可以滿足隊列的需要,單鏈表消耗最大的就是尾刪后遍歷查找新尾節點,但隊列不需要尾刪,所以不存在這個問題。

隊列的入隊列順序和出隊列順序一定是相同的。

隊列的實現

隊列的C語言實現,我們要實現的函數和實現棧是差不多的:
只是其存放數據的數據結構變為了一個鏈表

頭文件queue.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QueueDataType;typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化和銷毀
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);//入隊列和出隊列
void QueuePush(Queue* pq, QueueDataType x);
void QueuePop(Queue* pq);//隊頭元素和隊尾元素
QueueDataType QueueFront(Queue* pq);
QueueDataType QueueBack(Queue* pq);//隊列長度函數
int QueueSize(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);

這里我們除了定義了鏈表節點的結構體QueueNode之外,我們還額外創建了一個Queue的結構體,這個結構體是用來存放隊列的一些信息的,phead指向隊頭,ptail則指向隊尾,這樣進行入棧和出棧的操作時,就可以直接通過這倆個指針直接對鏈表進行頭刪和尾插操作,從而實現出隊列和入隊列操作,;size則表示隊列的數據個數。

實現函數接口

1.初始化和銷毀

因為我們是通過Queue結構體來操作隊列的,所以不論初始化還是后面的函數都需要的是Queue*類型的指針;

//初始化和銷毀
void QueueInit(Queue* pq)
{assert(pq);pq->size = 0;pq->phead = pq->ptail = NULL;
}
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}

由于是本質是一個鏈表結構,所以在釋放空間時,需要遍歷鏈表進行釋放。

2.出隊列和入隊列

隊列入數據只能從隊尾插入;出數據只能從隊頭出。

//入隊列(尾插)
void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);//動態申請空間創建空間QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail!");return;}newnode->data = x;newnode->next = NULL;//沒有節點時if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else//存在節點{pq->ptail->next = newnode;pq->ptail = newnode;}//隊列長度pq->size++;
}
//出隊列(頭刪)
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead != NULL);//只有一個節點if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else//多個節點{QNode* newhead = pq->phead->next;free(pq->phead);pq->phead = newhead;}pq->size--;
}

入隊列和出隊列就是運用的鏈表的尾插和頭刪的邏輯。

3.獲取隊頭元素和隊尾元素

//隊頭元素和隊尾元素
QueueDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead != NULL);return pq->phead->data;
}
QueueDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail != NULL);return pq->ptail->data;
}

由于我們的Queue結構體中就存儲了隊頭和隊尾的地址,所以這兩個函數就可以直接返回對應的數據。

4.隊列長度+判空

//隊列長度函數
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return !(pq->size);
}

Queue結構體中的size就是在這里起作用的,如果沒有size這個成員,就需要遍歷鏈表來實現。

后記

本篇隊列的介紹和C語言實現就結束啦!

下篇我們將講解幾道棧和隊列的相關OJ題,大家不見不散哦!

那么我們下次見~

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

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

相關文章

Java入門基礎學習筆記36——面向對象基礎

面向對象編程快速入門&#xff1a; 計算機是用來處理數據的。 單個變量 數組變量 對象數據 Student類&#xff1a; package cn.ensource.object;public class Student {String name;double chinese_score;double math_score;public void printTotalScore() {System.out.pr…

【哈希】Leetcode 219. 存在重復元素 II【簡單】

存在重復元素 II 給你一個整數數組 nums 和一個整數 k &#xff0c;判斷數組中是否存在兩個 不同的索引 i 和 j &#xff0c;滿足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 示例 1&#xff1a; 輸…

偏微分方程算法之橢圓型雙調和方程問題

目錄 一、研究對象 二、問題解析 一、研究對象 針對雙調和方程的邊值問題:

達夢數據庫使用dmlcvt命令找回更改前的數據

在生產系統上不小心修改了表數據后最快的方法是用閃回查詢找回。但時間不能超過undo_retention&#xff08;默認90秒&#xff09;。其實最標準的處理方法是在其他機器上將數據庫恢復到修改前的時刻。但數據庫比較大時恢復時間較長。真實場景可能比較急。那么也可以分析歸檔日志…

數組序號Spinner

使用Spnner代替編輯框&#xff0c;只能選擇已有的&#xff0c;不會越界&#xff0c;大大簡化了代碼。 String[] SA new String[list.size()]; for (int i0; i<SA.length; i) {SA[i] String.valueOf(i); } ArrayAdapter<String> adapter1 new ArrayAdapter<>(…

[國產大模型簡單使用介紹] 開源與免費API

個人博客:Sekyoro的博客小屋 個人網站:Proanimer的個人網站 隨著大模型技術蓬勃發展和開源社區越來越活躍,國內的大模型也如雨后春筍一般.這時,一些就會問了,有了llama3,Mistral還有Gemma等等,國外大廠接連發力,一些開源社區也會有一些不錯的模型,國內怎么比?對一個人使用,oll…

下雨!大水蟻引發的水文!看比賽咯,曼聯VS曼城——早讀(逆天打工人爬取熱門微信文章解讀)

嘮嘮嗑 水一水 引言Python 代碼結尾 引言 今天星期六 大小周 一個等了很久的雙休 昨天晚上真的是嚇到我了 漫天的小飛蟲 我一開始還以為是一兩只 沒想到那些小飛蟲 從陽臺不斷飛進來 在山卡拉下面租房子 也是太恐怖了 來個特寫 他們也就一個晚上的時間 成蟲 天氣合適 長翅…

大語言模型發展歷史

大語言模型的發展歷史可以追溯到自然語言處理&#xff08;NLP&#xff09;和機器學習早期的探索&#xff0c;但真正快速發展起來是在深度學習技術興起之后。以下是大語言模型發展的一個簡要歷史概述&#xff1a; 早期階段&#xff08;20世紀50-90年代&#xff09;&#xff1a; …

網絡拓撲—DNS服務搭建

文章目錄 DNS服務搭建網絡拓撲配置網絡DNSPC 安裝DNS服務配置DNS服務創建正向查找區域創建反向查找區域創建子域名 PC機DNS域名解析 DNS服務搭建 網絡拓撲 為了節省我的U盤空間&#xff0c;沒有用路由器&#xff0c;所以搭建的環境只要在同網段即可。 //交換機不用考慮 DNS&a…

MiniCPM-Llama3-V-2_5-int4

MiniCPM-Llama3-V-2_5-int4大模型部署使用環境&#xff1a; python3.8cuda11.8其它要求&#xff0c;按照安裝文檔要求下載即可 我是在算力平臺用4090跑的&#xff0c; GPU 顯存&#xff08;8GB&#xff09;可以部署推理 int4 量化版本&#xff0c;如果推理非量化版本需要更高顯…

云部署最簡單python web

最近在玩云主機&#xff0c;考慮將簡單的web應用裝上去&#xff0c;通過廣域網訪問一下&#xff0c;代碼很簡單&#xff0c;所以新手幾乎不會碰到什么問題。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.route(/gree…

2024洗地機哪個牌子好?洗地機十大品牌

洗地機在不同家庭環境中都能發揮其獨特的優勢&#xff0c;無論是大面積的地板還是狹小的角落&#xff0c;都能輕松應對。 對于有孩子或寵物的家庭&#xff0c;地面上經常會有各種雜物和污漬&#xff0c;洗地機強大的吸力和深度清潔功能&#xff0c;可以迅速清理掉這些臟東西&a…

數理邏輯:1、預備知識

17.1 命題和聯結詞 ? 命題&#xff1a;可以判定真假的陳述句。&#xff08;則悖論&#xff0c;祈使句&#xff0c;疑問句都不是命題&#xff09; ? 原子命題&#xff1a;不能被分割為更小的命題的命題 例如&#xff1a; 2既是素數又是偶數 可以由$p: 2 是素數&#xff0c;…

DNS的服務與部署(2)

1、dns的安裝及開啟 dnf install bind.x86_64 -y #安裝 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #啟用dns服務&#xff0c;服務名稱叫named firewall-cmd --permanent --add-servicedns #火墻設置 firewall-cmd --reload …

基于SSH的母嬰用品銷售管理系統帶萬字文檔

文章目錄 母嬰商城系統一、項目演示二、項目介紹三、系統部分功能截圖四、萬字論文參考五、部分代碼展示六、底部獲取項目源碼和萬字論文參考&#xff08;9.9&#xffe5;帶走&#xff09; 母嬰商城系統 一、項目演示 母嬰商城系統 二、項目介紹 基于SSH的母嬰商城系統 系統…

Tina-Linux -- 3. LVGL測試

參考韋東山 – Tina_Linux_圖形系統_開發指南 Tina-linux lvgl 配置 環境配置 進入Tina-SDK根目錄 source build/envsetup.sh lunch XXX平臺名稱 make menuconfigLVGL Gui --->Littlevgl --->< > lv_demo<*> lv_examples &#xff08;lvgl官方demo&#…

【區塊鏈】fisco節點運維 更新ing

基于已完成的區塊鏈系統與管理平臺搭建工作&#xff0c;開展區塊鏈節點的加入與退出運維工作&#xff0c;具體內容如下 以下只是舉例子講 如果有其他修改沒舉例出來可以留言 私信 主要以比賽出題的形式講 區塊鏈節點輸出等級為警告級&#xff0c;并設置日志存儲閾值為100MB并…

主機與VMware虛擬機共享文件夾

虛擬機M --> 設置 --> 選項 --> 共享文件夾 虛擬機里的共享文件夾需要掛載 sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other from 主機與VMware虛擬機共享文件夾&#xff1a;解決虛擬機找不到共享文件夾問題 - 知乎

C++實現的代碼行數統計器

代碼在GitHubMaolinYe/CodeCounter: C20實現的代碼統計器&#xff0c;代碼量小于100行&#xff0c;可以統計目錄下所有代碼文件的行數 (github.com) 前段時間到處面試找實習&#xff0c;有技術負責人的負責人問我C寫過多少行&#xff0c;5萬還是10萬&#xff0c;用來評估熟練度…

Capture One Studio for Mac:打造完美影像的利器

對于攝影師而言&#xff0c;每一次按下快門都是一次對完美影像的追求。而Capture One Studio for Mac正是這樣一款能夠幫助你實現這一追求的利器。 Capture One Studio for Mac v16.4.2.1中文直裝版下載 首先&#xff0c;Capture One Studio for Mac擁有出色的圖像處理能力。它…