網站首頁 編程語言 正文
一、隊列的性質
上次我們學習棧,了解到棧儲存釋放數據的方式是:先進后出
而隊列與其相反,隊列是:先進先出,后進后出。
二、隊列的結構
多個鏈表節點 + 頭尾指針 ? (鏈表式隊列)
鏈表節點負責存儲數據;頭節點 負責定位先進的起始數據,方便先出;
尾節點負責記錄尾部數據,方便確定隊列當前狀態。
三、代碼實現
頭文件
這里方便統一調用,將頭尾指針定義成一個結構體 。?
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int Quetype; //定義隊列的數據類型
typedef struct QueNode //定義數據節點
{
struct QueNode* Next;
Quetype data;
}QueNode;
typedef struct Quetail
{
struct QueNode* head; //定義頭尾指針
struct QueNode* tail;
}Quetail;
void Que_Init(Quetail* pq); //隊列的初始化
void Que_Destory(Quetail* pq); //隊列的銷毀
void Que_push(Quetail* pq ,Quetype data); //插入數據
void Que_pop(Quetail* pq); //刪除數據
bool Que_Empty(Quetail* pq); //判斷隊列是否為空
int Que_size(Quetail* pq); //統計隊列長度
int Que_front(Quetail* pq); //查找隊列的頭部數據
功能函數
1.隊列的初始化:
將頭尾指針置為NULL 方便后續使用。
void Que_Init(Quetail* pq) //隊列的初始化
{
assert(pq);
pq->head = pq->tail = NULL;
}
2.插入數據:
創建鏈表節點 >> 導入數據 >> 頭部指針指向頭節點 >> 尾部指針指向尾節點?
//插入數據
void Que_push(Quetail* pq,Quetype data)
{
assert(pq);
QueNode* NewNode = (QueNode*)malloc(sizeof(QueNode));//創建節點
if (NewNode == NULL)
{
printf("Que_push->malloc");
exit(-1);
}
NewNode->Next = NULL;
NewNode->data = data;
if (pq->head == NULL) //判斷是否創建為頭節點
{
pq->head = NewNode; //更新頭指針
}
else
{
pq->tail->Next = NewNode; //不為頭節點,就正常鏈接在尾節點后
}
pq->tail = NewNode; //更新尾指針
}
3.刪除數據:
記錄頭節點的下一個位置 >> 判斷是否為最后的數據 >> 更新頭指針
細節點:如果隊列中還剩多個節點時,刪除頭節點后,尾指針始終指向尾節點,不需要改動;
但是如果只剩一個數據節點的話,刪除后需要將尾指針置空。
//刪除數據
void Que_pop(Quetail* pq)
{
assert(pq);
assert(!Que_Empty(pq)); //判斷隊列是否為空
QueNode* Next = pq->head->Next; //記錄刪除數據的
if (pq->head == pq->tail) //判斷是否是最后的數據
{
free(pq->head);
pq->tail = NULL; //更新尾指針
}
else
{
free(pq->head);
}
pq->head = Next; //更新頭指針
}
4.判斷列表是否為空:
用bool 作為返回類型
//判斷隊列是否為空
bool Que_Empty(Quetail* pq)
{
assert(pq);
return pq->head == NULL;
}
5.查找隊列的頭部數據:
判斷隊列是否為空 >> 返回頭部數據
//查找隊列的頭部數據
Quetype Que_front(Quetail* pq)
{
assert(pq);
assert(!Que_Empty(pq)); //判斷隊列是否為空
return pq->head->data; //返回頭部數據
}
6. 統計隊列的長度:
就是統計有多少個鏈表節點
int Que_size(Quetail* pq)
{
assert(pq);
int size;
QueNode* pphead = pq->head;
for (size = 0; pphead; pphead = pphead->Next, size++);
return size;
}
7.隊列的銷毀:
依次刪除數據 >> 將申請空間釋放
細節點:這里可以進行復用:判斷隊列是否為空 、 刪除數據
void Que_Destory(Quetail* pq)
{
for (; !Que_Empty(pq); ) //判斷隊列是否為空
{
Que_pop(pq); //刪除數據
}
}
原文鏈接:https://blog.csdn.net/MT_125/article/details/125592627
相關推薦
- 2023-07-07 TP6的服務在自定義composer包中如何使用
- 2022-04-11 架構思維之緩存雪崩的災難復盤_相關技巧
- 2022-05-14 C++使用new和delete進行動態內存分配與數組封裝_C 語言
- 2022-10-12 pandas實現手機號號碼中間4位匿名化的示例代碼_python
- 2022-10-25 C++構建函數使用介紹_C 語言
- 2023-07-03 Redis 中 List(列表)類型的命令及詳解
- 2022-11-20 spring?boot集成redis基礎入門實例詳解_Redis
- 2022-10-19 Android開發flow常見API的使用示例詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支