網站首頁 編程語言 正文
隊列
這篇博客主要介紹一下隊列的概念,并且采用 C 語言,編寫兩種存儲實現方式:順序存儲和鏈式存儲,當然還有常規的隊列基本操作的實現算法
隊列基本概念
標準解釋:隊列(Queue)是有限個**同類型數據元素的線性序列,是一種先進先出**(First In First Out FIFO)的線性表,新鍵入的數據元素插在隊列尾端,出隊列的數據元素在隊列首部被刪除。
教材中給了一個示意圖,不錯
順序隊列結構類型中有三個域:data、front、rear。
data:一維數組,存儲隊列中的數據元素 font:指向隊列首元素的前一個單元 rear:指向實際的隊列尾元素單元
參考示意圖
入隊列操作可以用兩條賦值語句
SQ.rear = SQ.rear+1; SQ.data[SQ.rear] = x;
出隊列操作可以用一條語句完成
SQ.front = SQ.front+1
但是,會出現一些問題,通過示意圖說明一下
當然還有一種情況,一邊入隊列,一邊出隊列 注意下圖,SQ.front 下面還有空間
所以為了解決這種假溢出問題,聰明的開發人員,想出來新的解決辦法了,造一個環兒~
循環隊列
下面看一個圖,重點看一下 SQ.rear 與 SQ.front 的對應位置
如果上述圖翻譯成 C 語言代碼,入隊核心邏輯為
SQ.rear = (SQ.rear+1) % maxsize ; SQ.data[SQ.rear] = x;
出隊列的核心邏輯為
SQ.front = (SQ.front+1)%maxsize;
你在學習的時候,肯定對SQ.rear+1
和SQ.front+1
有疑問
我們舉例來說明一下吧
順序隊列的 C 語言實現
接下來難度指數上升,開始用 C 語言編寫代碼吧
一頓操作之后,還是比較簡單的,總之不寫鏈式存儲,順序的還是比較簡單的
#include <stdio.h> #include <stdlib.h> //循環隊列最大數據元素個數 const int maxsize = 8; //循環隊列的結構體 typedef struct cycqueue{ int *data; int front,rear; } CycQue; //隊列初始化 void init(CycQue *CQ){ CQ->data = (int *)malloc(maxsize*sizeof(int)); CQ->front = 0; CQ->rear = 0; } //判斷隊列是否為空 int empty(CycQue *CQ){ if(CQ->rear==CQ->front) return 1; else return 0; } //入隊列 int EnQueue(CycQue *CQ,int x){ if((CQ->rear+1)%maxsize==CQ->front){ printf("隊列滿"); return 0; } else{ CQ->rear =(CQ->rear+1) % maxsize; CQ->data[CQ->rear] = x; return 1; } } //出隊列 int OutQueue(CycQue *CQ){ if(empty(CQ)){ printf("隊列為空"); return 0; } else{ CQ->front = (CQ->front+1) % maxsize; return 1; } } int main() { CycQue CQ; init(&CQ); EnQueue(&CQ,2); EnQueue(&CQ,4); printf("%d",CQ.rear); OutQueue(&CQ); printf("%d",CQ.front); return 0; }
鏈式隊列的 C 語言實現
鏈式隊列其實有之前的經驗之后,寫起來難度系數也不會太高,接下來我們編寫一個核心的部分代碼
隊列的鏈接實現實際上是用一個帶有頭結點的單鏈表來表示隊列,成為鏈隊列 頭指針指向鏈表的頭結點 單鏈表的頭結點的 next 域指向隊列首結點 尾指針指向隊列尾結點,即單鏈表的最后一個結點
初始化
#include <stdio.h> #include <stdlib.h> typedef struct LinkQueueNode{ int *data; struct LinkQueueNode *next; } LkQueNode; typedef struct LkQueue{ LkQueNode *front,*rear; } LkQue; void init(LkQue *LQ){ LkQueNode *temp; temp = (LkQueNode *)malloc(sizeof(LkQueNode)); //生成隊列的頭結點 LQ->front = temp; //隊列頭指針指向隊列頭結點 LQ->rear = temp; //隊列尾指針指向隊列尾結點 (LQ->front)->next = NULL; }
核心兩個操作入隊列和出隊列
入隊列代碼如下
//入隊列 void EnQueue(LkQue *LQ,int x){ LkQueNode *temp; temp = (LkQueNode *)malloc(sizeof(LkQueNode)); temp->data = x; temp-next = NULL; (LQ->rear)->next = temp; LQ->rear = temp; }
出隊列這個事情就交給你自己吧,好好理解一下,就可以寫出來了
自考要點
在考試中,隊列容易出現編碼題目,占比在 7~10 分,所以還是蠻重要的呢!
原文鏈接:https://juejin.cn/post/7148685813537046542
相關推薦
- 2022-06-06 typescript封裝屬性、public、private、protected、constructo
- 2023-02-14 C++關于字符的接收與輸出操作示例_C 語言
- 2022-08-05 unsupported media type 415
- 2022-12-15 C++?Boost?Lockfree超詳細講解使用方法_C 語言
- 2022-06-12 Python利用subplots_adjust方法解決圖表與畫布的間距問題_python
- 2023-12-11 Mybatis數據庫操作筆記(Mybatis基礎CRUD代碼)
- 2022-06-11 C#實現DataTable轉TXT、CSV文件_C#教程
- 2023-07-15 oracle 序列/自增ID
- 最近更新
-
- 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同步修改后的遠程分支