探索數據結構:隊列的的實現與應用

?🔑🔑博客主頁:阿客不是客

🍓🍓系列專欄:漸入佳境之數據結構與算法

歡迎來到泊舟小課堂

😘博客制作不易歡迎各位👍點贊+?收藏+?關注

一、隊列的概念

隊列是一個線性的數據結構,并且這個數據結構只允許在一端進行插入,另一端進行刪除,禁止直接訪問除這兩端以外的一切數據,且隊列是一個先進先出的數據結構。

通常,稱進數據的一端為隊尾,出數據的一端為隊首,數據元素進隊列的過程稱為入隊,出隊列的過程稱為出隊

隊列與棧類似,實現方式有兩種。一種是以數組的方式實現,另一種以單鏈表來實現。這兩種實現方式各有優劣,并且都有細節需要處理。

二、隊列的聲明與初始化

隊列只有鏈式的設計方法,其本身分為多種隊列,如順序隊列和循環隊列,還有衍生的優先隊列等等,以順序隊列的設計為例。

首先是隊列的結點設計,可以設計出兩個結構體,一個結構體 Node 表示結點,其中包含有 data 針,如圖:

其中 data 表示數據,其可以是簡單的類型,也可以是復雜的結構體。next 指針表示,下一個的指針,其指向下一個結點,通過 next 指針將各個結點鏈接。

然后再添加一個結構體,其包括了兩個分別永遠指向隊列的隊尾和隊首的指針,看到這里是不是覺得和棧很像?

主要的操作只對這兩個指針進行操作,如圖所示:

代碼實現如下:

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

對于初始化需要初始化兩個類型,一個是初始化結點,一個是初始化隊列。代碼中的描述,初始化隊列有些不同,當初始化隊列的時候,需要將頭尾兩個結點指向的內容統統置為空,表示是一個空隊列,函數代碼可以表示為:

void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}

三、入隊

入隊操作如圖:

進行入隊(push)操作的時候,同樣的,首先需要判斷隊列是否為空,如果隊列為空的話,需要將頭指針和尾指針一同指向第一個結點

如果隊列不為空的時候,這時只需要將尾結點向后移動,通過不斷移動?next指針指向新的結點構成隊列即可。

void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("realloc fail");}newnode->next = NULL;newnode->val = x;if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}

四、出隊

出隊操作如圖:

出隊(pop)操作,是指在隊列不為空的情況下進行的一個判斷,當然在此也一定要進行隊列判空的操。

如圖,如果隊列只有一個元素了,也就是說頭尾指針均指向了同一個結點,那么直接將頭尾兩指針置空,并釋放這一個結點即可,如圖:

當隊列含有以上個元素時,需要將隊列的頭指針指向頭指針當前指向的下一個元素,并釋放掉當前元素即可,如圖:

代碼實現如下:

void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;} else{QNode* next = pq->phead;pq->phead = pq->phead->next;free(next);}pq->size--;
}

五、獲取隊頭和隊尾元素

我們有頭尾節點的指針,只需要注意鏈表和節點元素不能為空即可

// 獲取隊列頭部元素 
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
// 獲取隊列隊尾元素 
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}

六、獲取隊列中有效元素個數

int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

七、檢測隊列是否為空

bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}

八、銷毀隊列

void QueueDestroy(Queue* pq)
{assert(pq);for (int i = 0; i < pq->size; i++){QNode* next = pq->phead;pq->phead = pq->phead->next;free(next);}pq->phead = pq->ptail = NULL;
}

九、完整代碼

9.1 Queue.h

typedef int QDataType;
// 鏈式結構:表示隊列 
typedef struct QListNode
{struct QListNode* next;QDataType val;
}QNode;// 隊列的結構 
typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;// 初始化隊列 
void QueueInit(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);
// 銷毀隊列 
void QueueDestroy(Queue* pq);

9.2 Queue.c

// 初始化隊列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
// 隊尾入隊列 
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("realloc fail");}newnode->next = NULL;newnode->val = x;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);if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;} else{QNode* next = pq->phead;pq->phead = pq->phead->next;free(next);}pq->size--;
}
// 獲取隊列頭部元素 
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
// 獲取隊列隊尾元素 
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}
// 獲取隊列中有效元素個數 
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0 
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
// 銷毀隊列 
void QueueDestroy(Queue* pq)
{assert(pq);for (int i = 0; i < pq->size; i++){QNode* next = pq->phead;pq->phead = pq->phead->next;free(next);}pq->phead = pq->ptail = NULL;
}

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

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

相關文章

windows環境下創建python虛擬環境

windows環境下創建python虛擬環境 使用virtualenv庫創建虛擬環境&#xff0c;可使不同的項目處于不同的環境中 安裝方法&#xff1a; pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua…

Spring Cloud Alibaba之負載均衡組件Ribbon

一、什么是負載均衡&#xff1f; &#xff08;1&#xff09;概念&#xff1a; 在基于微服務架構開發的系統里&#xff0c;為了能夠提升系統應對高并發的能力&#xff0c;開發人員通常會把具有相同業務功能的模塊同時部署到多臺的服務器中&#xff0c;并把訪問業務功能的請求均…

談談WebComponents | 前端開發

一、 源起 讓我們以一個例子開始。 假設我們要做一個環形進度條&#xff0c;它可以&#xff1a; 1、根據進度數值的不同&#xff0c;計算出百分比&#xff0c;以渲染對應的角度值。 2、根據設置的進度不同&#xff0c;我們用不同的顏色加以區分。 3、在環的中間我們以動畫遞增的…

小程序、APP對接廣告聯盟進行廣告變現有什么區別?

小程序VS APP對接廣告聯盟有什么區別&#xff1f; 開發完成的小程序對接廣告聯盟廣告變現&#xff0c;開發完成的APP對接廣告聯盟有什么區別&#xff1f; 首先小程序對接廣告聯盟&#xff0c;無論是微信小程序還是抖音小程序都只支持對接單一的廣告聯盟接入。抖音小程序只支持…

【監控】監控平臺部署 Prometheus+Grafana

在 macOS 上部署 Grafana 和 Prometheus 來監控 Java 服務是一個非常實用的操作。以下是詳細的步驟&#xff0c;包括如何安裝和配置 Prometheus、Grafana 以及在 Java 服務中集成 Prometheus 的客戶端庫來收集指標數據。 1. 安裝 Prometheus 1.1 使用 Homebrew 安裝 Promethe…

簡單分享項目內如何快速自動生成自己的庫和更新 requirements.txt

當開發Python項目時&#xff0c;requirements.txt文件被用來清單所有所需的Python包及其版本。這個文件對于在不同環境中安裝和管理項目依賴特別方便&#xff0c;無論是在生產環境、開發環境或者CI/CD流程中。 要自動創建和更新requirements.txt文件&#xff0c;有幾種常見的方…

深入剖析 @Autowired 和 @Resource 在 Spring 中的區別

在 Spring 框架中&#xff0c;Autowired 和 Resource 是兩個常用的注解&#xff0c;用于實現依賴注入。盡管它們都能達到將依賴對象注入到目標 bean 的目的&#xff0c;但在細節上存在一些顯著的差異。本文將深入探討這兩個注解的區別&#xff0c;并結合 Spring 源碼進行分析&a…

vision mamba

Mamba 成功的關鍵在于采用了 Selective Scan Space State Sequential Model&#xff08;S6 模型&#xff09;。是用于解決自然語言處理&#xff08;NLP&#xff09;任務。與 transformer中注意力機制不同&#xff0c;Mamba的S6 將 1D 向量中的每個元素&#xff08;例如文本序列…

現代信息檢索筆記(二)——布爾檢索

目錄 信息檢索概述 IR vs數據庫: 結構化vs 非結構化數據 結構化數據 非結構化數據 半結構化數據 傳統信息檢索VS現代信息檢索 布爾檢索 倒排索引 一個例子 建立詞項&#xff08;可以是字、詞、短語、一句話&#xff09;-文檔的關聯矩陣。 關聯向量 檢索效果的評價 …

如何在Sklearn Pipeline中運行CatBoost

介紹 CatBoost的一大特點是可以很好的處理類別特征&#xff08;Categorical Features&#xff09;。當我們將其結合到Sklearn的Pipeline中時&#xff0c;會發生如下報錯&#xff1a; _catboost.CatBoostError: data is numpy array of floating point numerical type, it mea…

python-期末代碼復習

import numpy as np import pandas as pd import matplotlib.pyplot as plt import warningswarnings.filterwarnings(actionignore) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False你提供的這兩行代碼是Python編程語言中用于設置matplotlib庫…

大淘客api實現多多進寶的商品查詢PHP版

大家好&#xff0c;我是網創有方&#xff0c;今天教大家如何使用大淘客的api實現拼多多商品詳情信息查詢。這里用到的多多進寶&#xff0c;如果沒有多多進寶的&#xff0c;先去多多進寶注冊個賬號吧&#xff01; 第一步&#xff1a;進入大淘客官方創建應用&#xff0c;并且下載…

【PyQt5】一文向您詳細介紹 QLineEdit() 的作用

【PyQt5】一文向您詳細介紹 QLineEdit() 的作用 下滑即可查看博客內容 &#x1f308; 歡迎蒞臨我的個人主頁 &#x1f448;這里是我靜心耕耘深度學習領域、真誠分享知識與智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主簡介&#xff1a;985高校的普通本碩&…

2239. 找到最接近 0 的數字

給你一個長度為 n 的整數數組 nums &#xff0c;請你返回 nums 中最 接近 0 的數字。如果有多個答案&#xff0c;請你返回它們中的 最大值 。 示例 1&#xff1a; 輸入&#xff1a;nums [-4,-2,1,4,8] 輸出&#xff1a;1 解釋&#xff1a; -4 到 0 的距離為 |-4| 4 。 -2 到…

開發一個微信小程序需要用到哪些技術?

開發一個微信小程序需要用到以下幾種技術&#xff1a; 1. 基礎技術 HTML: 用于定義小程序的頁面結構。CSS: 用于頁面的樣式設計。JavaScript: 用于實現頁面的交互功能。 2. 微信小程序專用技術 WXML&#xff08;WeiXin Markup Language&#xff09;: 類似于HTML&#xff0c…

計量校準溫度儀表的常見分類有哪些?

溫度儀表在計量校準中&#xff0c;可以說是比較常見的儀器&#xff0c;而溫度儀器因為用于校準的場景很多&#xff0c;應用的場合不同&#xff0c;也是有著很多不同的分類&#xff0c;今天就簡單為大家介紹一些溫度儀表的細分分類。 溫度儀表根據測溫的方式不同&#xff0c;可以…

2024華為OD機試真題- 電腦病毒感染-(C++/Python)-C卷D卷-200分

2024華為OD機試題庫-(C卷+D卷)-(JAVA、Python、C++) 題目描述 一個局域網內有很多臺電腦,分別標注為 0 ~ N-1 的數字。相連接的電腦距離不一樣,所以感染時間不一樣,感染時間用 t 表示。 其中網絡內一臺電腦被病毒感染,求其感染網絡內所有的電腦最少需要多長時間。如果…

Laravel Activity Log操作日志擴展包

Laravel Activity Log操作日志擴展包 簡介 Laravel Action Logs操作日志記錄Laravel Activity Log 很多數據管理員都想記錄他們用戶的所有活躍記錄。這個包可以很方便的記錄你的用戶何時何地的創建、更新實體的記錄。外加&#xff0c;現在這個包還可以記錄多個版本的實體間數…

【基礎篇】第3章 索引與文檔操作

在Elasticsearch的世界里&#xff0c;索引是存儲數據的地方&#xff0c;文檔則是索引中的基本單位&#xff0c;包含具體的數據信息。本章將深入探討索引和文檔操作的基礎&#xff0c;從創建到管理&#xff0c;為高效數據處理奠定基礎。 3.1 索引概念與創建 3.1.1 索引、類型與…

PyTorch之nn.Module與nn.functional用法區別

文章目錄 1. nn.Module2. nn.functional2.1 基本用法2.2 常用函數 3. nn.Module 與 nn.functional3.1 主要區別3.2 具體樣例&#xff1a;nn.ReLU() 與 F.relu() 參考資料 1. nn.Module 在PyTorch中&#xff0c;nn.Module 類扮演著核心角色&#xff0c;它是構建任何自定義神經網…