隊列的實現

學習就像一段長跑,比的不是誰跑得快,而是誰更能堅持!!


?1 隊列的概念及結構

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

?和棧不同的是,隊列的出隊順序是唯一的!

2 隊列的實現

分析

有兩種實現隊列的方式:數組鏈表。鏈表可以用單鏈表也可以用雙鏈表。

使用鏈表的結構實現更優一些,因為如果使用數組的結構,出隊列在數組頭上出數據,效率很低!
數組實現:效率低!!

鏈表實現:單鏈表更合適!!

思考一個問題,需要帶哨兵位的頭節點嗎?

  • 其實都可以,不帶也可以,可以不用判斷直接尾插,但是如果帶了哨兵位的頭節點,要malloc,最后也要free釋放空間。

因為隊列我們只需要入隊(尾插)和出隊(頭刪),單鏈表都可以實現,不需要使用雙鏈表。但是我們要想,我們要怎么分清隊頭和隊尾呢?所以我們在尾插頭刪的時候:

  • 需要ptail指針維護隊列最后一個元素
  • 需要phead指針維護隊列第一個元素

那么這個時候實現起來就需要用到二級指針了。很不方便。

那么我們怎么解決這個問題呢?(不用二級指針的等效替換方法)

①帶哨兵位的頭節點。②返回值。③可以考慮用一個結構體封裝起來。

這里我們用結構體。?

代碼實現

Test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"Queue.h"int main()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);printf("%d ", QueueFront(&q));QueuePop(&q);printf("%d ", QueueFront(&q));QueuePop(&q);QueuePush(&q, 4);QueuePush(&q, 5);while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}QueueDestroy(&q);return 0;
}

函數聲明Queue.h

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int QDataType;//創建隊列節點
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;//創建維護隊列的指針
typedef struct Queue
{QNode* phead;QNode* ptail;int size;//原本是需要遍歷的,寫在結構體里可以很好的是時間復雜度由O(N)變為O(1)
}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);//判斷是否為空
bool QueueEmpty(Queue* pq);//隊列元素個數
int QueueSize(Queue* pq);

函數實現Queue.c?

初始化QueueInit
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}
空間釋放QueueDestroy
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;
}
入隊列QueuePush

這里需要創建一個節點

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

要注意兩種情況

  • 空鏈表
  • 只有一個元素(ptail野指針的情況,要進行判斷置空)
void QueuePop(Queue* pq)
{assert(pq);//鏈表不為空assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;//鏈表中只有一個元素,刪完以后為空if (pq->phead == NULL)pq->ptail = NULL;pq->size--;
}
隊頭元素QueueFront
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
隊尾元素QueueBack
QDataType QueueBack(Queue* pq)
{assert(pq); assert(pq->ptail);return pq->ptail->val;
}
判斷隊列是否為空QueueEmpty
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}
隊列元素個數QueueSize
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

Queue.c總代碼

#define _CRT_SECURE_NO_WARNINGS 1#include"Queue.h"void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}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;
}void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}void QueuePop(Queue* pq)
{assert(pq);// assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL)pq->ptail = NULL;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;
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

以上就是用單鏈表實現隊列的代碼實現。

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

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

相關文章

外網訪問內網服務器使用教程

如何在任何地方都能訪問自己家里的筆記本上的應用&#xff1f;如何讓局域網的服務器可以被任何地方訪問到&#xff1f;有很多類似的需求&#xff0c;我們可以統一用一個解決方案&#xff1a;內網穿透。內網穿透的工具及方式有很多&#xff0c;如Ngrok、Ssh、autossh、Natapp、F…

linux具體命令(一)

1. cd CD命令是Linux和類Unix操作系統中非常常用的一個命令&#xff0c;它的全稱是“change directory”&#xff0c;用于改變當前的工作目錄。用戶可以通過這個命令進入到不同的目錄中&#xff0c;進行文件操作或是執行其他任務。 以下是CD命令的一些基本用法&#xff1a; 進…

特殊進程之守護進程

文章目錄 1、守護進程的概念2、如何查看守護進程3、編寫守護進程的步驟3.1 創建子進程&#xff0c;父進程退出3.2 在子進程中創建新會話3.3 改變當前工作目錄3.4 重設文件權限掩碼3.5 關閉不需要的文件描述符3.6 某些特殊的守護進程打開/dev/null 4、守護進程代碼示例 1、守護進…

[UNILM]論文實現:Unified Language Model Pre-training for Natural Language.........

文章目錄 一、完整代碼二、論文解讀2.1 介紹2.2 架構2.3 輸入端2.4 結果 三、過程實現四、整體總結 論文&#xff1a;Unified Language Model Pre-training for Natural Language Understanding and Generation 作者&#xff1a;Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xia…

js new 原理

mdn new new 調用函數時&#xff0c;該函數將被用作構造函數 類只能用 new 運算符實例化 不使用 new 調用一個類將拋出 TypeError。 過程 new Foo(…) 執行時&#xff1a; 創建一個空的簡單 JavaScript 對象。 為方便起見&#xff0c;我們稱之為 newInstance。 如果構造函數…

華為OD機試真題-執行任務賺積分-2023年OD統一考試(C卷)

題目描述: 現有N個任務需要處理,同一時間只能處理一個任務,處理每個任務所需要的時間固定為1。 每個任務都有最晚處理時間限制和積分值,在最晚處理時間點之前處理完成任務才可獲得對應的積分獎勵。 可用于處理任務的時間有限,請問在有限的時間內,可獲得的最多積分。 輸入…

《LeetCode力扣練習》代碼隨想錄——字符串(替換數字---Java)

《LeetCode力扣練習》代碼隨想錄——字符串&#xff08;替換數字—Java&#xff09; 刷題思路來源于 代碼隨想錄 54. 替換數字 受制于語言限制&#xff0c;很普通的解法 import java.util.Scanner; class Main {public static void main(String[] args) {Scanner innew Scanner…

MyBatis--07--啟動過程分析、SqlSession安全問題、攔截器

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 談談MyBatis的啟動過程具體的操作過程如下&#xff1a;實現測試類,并測試SqlSessionFactorySqlSession SqlSession有數據安全問題?在MyBatis中&#xff0c;SqlSess…

vuex如何存儲數據、獲取數據、以及數據的持久化

前提必須已經在vue中安裝了vuex插件不然無法使用&#xff0c;不知道怎么創建vue和安裝vuex的可以看這個視頻&#xff0c;node.js版本最好16以上不然可能會安裝失敗&#xff1a;30分鐘學會Vue之VueRouter&Vuex 趁著暑假掌握一門技能 大學生前端實習畢業設計必備技能_嗶哩嗶哩…

好代碼資源網整站打包代碼(包含了最新數據),集成了深度二開的ripro主題,非常適合做資源網站創業用

好代碼資源網是基于wordpress開發的一個資源分享類網站&#xff0c;在開發者圈子里還算小有名氣&#xff0c;這里分享嬰整站打包代碼&#xff08;包含了最新數據&#xff09;。網站本身集成了深度二開的ripro主題&#xff0c;非常適合做資源網站創業用。 資源下載類網站目前還…

Button背景顏色改不了,一直是默認的紫色

使用android.widget.Button <android.widget.Buttonandroid:layout_width"wrap_content"android:layout_height"wrap_content"android:onClick"doClick"android:text"這是一個按鈕"android:textColor"color/black"androi…

kubesphere安裝后啟用DevOps

官方文檔&#xff1a;KubeSphere DevOps 系統 1、集群管理---定制資源定義 進入目錄&#xff1a;集群管理---定制資源定義搜索&#xff1a;clusterconfiguration 點擊 ks-installer 右側的 &#xff0c;選擇編輯 YAML 在該 YAML 文件中&#xff0c;搜索 devops&#xff0c;…

力扣98. 驗證二叉搜索樹

深度優先遍歷 思路&#xff1a; 根據二叉搜索樹特性&#xff0c;通過中序遍歷得到有序序列&#xff0c;驗證序列是否有序來判斷&#xff1b;中序遍歷使用棧通過深度優先遍歷&#xff1b; /*** Definition for a binary tree node.* struct TreeNode {* int val;* Tre…

No CUDA GPUs are available

文章目錄 前言嘗試方法一、嘗試方法一二、嘗試方法二 總結 前言 之前用服務器跑的時候&#xff0c;發現是可以跑的。但當有其他人一同使用的時候&#xff0c;就會拋出&#xff1a;No CUDA GPUs are available&#xff0c;這個時候我嘗試了以下兩種方式解決&#xff0c;后面終于…

一到冬天,助聽器出現聲音小、無聲、時有時無……

冬天是一個寒冷干燥的季節&#xff0c;對于助聽器的使用者來說&#xff0c;也是一個需要特別注意保養的季節。助聽器是高精密的電子產品&#xff0c;如果不注意保養&#xff0c;可能會出現聲音小、無聲、時有時無等故障&#xff0c;影響聽力康復的效果。那么&#xff0c;冬天我…

C++中string類的使用

目錄 一.string類 1.1為什么學習string類&#xff1f; 1.2.標準庫中的string類 二.string對象的元素訪問 2.1.1使用operator[]與at實現訪問 2.1.2正向迭代器訪問 2.1.3反向迭代器訪問 2.1.4const正向迭代器&#xff08;不能修改&#xff09; 2.1.5const反向迭代器&#…

計算機網絡知識點合集【王道計算機考研】

學習的最大理由是想擺脫平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;遲一天就多一天平庸的困擾。各位小伙伴&#xff0c;如果您&#xff1a; 想系統/深入學習某技術知識點… 一個人摸索學習很難堅持&#xff0c;想組團高效學習… 想寫博客但無從下手&#xff0c;急需…

維護真實時間:應對系統時間篡改的技巧

引言 在App使用中&#xff0c;由于系統時間用戶可以隨意更改&#xff0c;在某些特殊情況下會導致獲取到的系統時間不正確問題。本篇代碼使用dart語言進行相關描述。 1.問題分析&#xff1a; 手機系統時間 ≠ 真實時間&#xff0c;當我們做一些需要對時間精度和準確性要求較高的…

SQL命令---修改數據庫的編碼

介紹 使用sql命令修改數據庫的編碼&#xff0c;修改為utf8mb4編碼。 命令 alter database 數據庫名稱 default character set utf8mb4;

垃圾收集算法和各種垃圾收集器的實現

深入理解Jvm虛擬機第三章 二、對象已死&#xff1f;3.2.1 引用計數算法3.2.2 可達性分析算法3.2.3 再談引用3.2.4 生存還是死亡3.2.5 回收方法區 三、垃圾收集算法3.3.1 分代收集理論3.3.2 標記-清除算法3.3.3 標記-復制算法3.3.4 標記-整理算法 四、HotSpot的算法細節實現3.4.…