上一章節針對於C語言棧結構作了解析,不清楚的能夠回顧一下。前端
本章節主要針對於C語言的基礎數據結構隊列作以解析。ios
隊列是一種特殊的 線性表 ,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。編程
故隊列基本操做以下:後端
(1)建立隊列數組
(2)入隊微信
(3)出隊數據結構
(4)判斷隊列是否爲NULL函數
(5)獲取隊頭元素學習
根據隊列實現方式與出隊方式,咱們能夠把棧分爲如下三種描述方式:測試
(1)原生數組隊列
(2)動態申請內存的數組描述(普通隊列和循環隊列)
(3)鏈式結構描述
原生數組描述隊列
數組描述棧,只不過多了先進先出的限制而已,它是靜態分配的,即便用前,它的內存就已經以數組的形式分配好了,因此在使用時,須要注意隊頭隊尾的標記。
原生數組描述隊列實現試題案例:逆序整數
動態數組描述隊列
動態申請內存的數組描述再也不採用上述實用性的方法了,而是經過封裝相關隊列函數去描述這種結構。這是寫數據結構的一種大體方法。
1.結構體定義與隊列的建立過程:
結構體定義:描述隊列的屬性:隊頭標記,隊尾標記,隊列空間
建立隊列其實就是建立結構體變量
具體代碼
ps:隊頭和隊尾頂標記初始值通常都是-1 ,爲了知足隊列標記和數組下標一致
2.入隊操做
注意: 咱們的實現是將最新的元素放在了數組的末尾, 那麼數組末尾的元素就是咱們的隊列隊尾元素,故可使用隊尾標記去計算隊列中的元素個數。而後每次入隊後,隊尾標記日後移動。
具體實現代碼:
3.出隊操做和獲取隊頭元素
注意: 出隊操做應該是將隊頭元素刪除,因爲數組實現的隊列沒法刪除,故只能把隊頭標記往隊尾移動,簡稱爲一種"僞刪除"。
具體實現代碼:
4.判斷棧是否爲空
用戶判斷棧中是否有元素,經過隊尾和隊頭標記去作便可
具體實現代碼:
動態申請內存的數組描述隊列測試代碼
ps:循環隊列是經過取餘造成的循環,這裏不過多介紹,有興趣的能夠看看相關資料。
鏈式隊列: 鏈表的尾插法便可
具體實現源碼獻上
#include <stdio.h> #include <stdlib.h> typedef struct { int data; struct Node* next; }NODE,*LPNODE; LPNODE createNode(int data) { LPNODE newNode = (LPNODE)malloc(sizeof(NODE)); newNode->data = data; newNode->next = NULL; return newNode; } typedef struct { int queueSize; LPNODE frontNode; LPNODE tailNode; }QUEUE,*LPQUEUE; LPQUEUE createQueue() { LPQUEUE queue = (LPQUEUE)malloc(sizeof(QUEUE)); queue->queueSize = 0; queue->frontNode = NULL; queue->tailNode = NULL; return queue; } void push(LPQUEUE queue, int data) { //無頭表頭鏈表的在封裝法 LPNODE newNode = createNode(data); if (queue->queueSize == 0) { queue->frontNode = newNode; queue->tailNode = newNode; } else { //無表頭鏈表的表尾插入 queue->tailNode->next = newNode; queue->tailNode = newNode; } queue->queueSize++; } //FILO +FIFO void pop(LPQUEUE queue) { if (queue->queueSize != 0) { LPNODE nextNode = queue->frontNode->next; free(queue->frontNode); queue->frontNode = nextNode; queue->queueSize--; } } int front(LPQUEUE queue) { return queue->frontNode->data; } int empty(LPQUEUE queue) { return queue->queueSize==0; } int size(LPQUEUE queue) { return queue->queueSize; } int main() { LPQUEUE queue = createQueue(); for (int i = 1; i <= 3; i++) { push(queue, i); } while (!empty(queue)) { printf("%d\t", front(queue)); pop(queue); } printf("\n"); system("pause"); return 0; }
優先隊列:根據優先權去決定你出隊的元素,故數據中存在優先權衡量的值,相關實現代碼以下:
#include <iostream> #define MaxQueueSize 100 //隊列的大小 //數據類型 數據自己 優先權 typedef int ElementType; //定義數據類型地 別名 //數據 結構體 typedef struct { int priority; //優先權---工做量 ElementType element;//隊列中的元素 }DataType; //隊列的結構體 typedef struct { int size; //結構體的嵌套 DataType Queue[MaxQueueSize]; }PriQueue; //讀取文件做業---調度讀取 //隊列操做 //初始化---初始化基本成員 //size Queue void InitQueue(PriQueue *Q) { Q->size = 0; } //判斷隊列是否爲空 NULL //和它的初始化比較 int QueueEmpty(PriQueue *Q) { // -> 指向運算符 C:結構體指針 C++: 類和結構體 // :: 做用域限定符 if (Q->size <= 0) return 0; //標誌 else return 1; //不爲空 // return 0 函數結束 } //入隊 文件操做 int Push(PriQueue *Q, DataType data) { //入隊前判斷是否滿 if (Q->size >= MaxQueueSize) { std::cout << "杯子已滿,沒法再倒水" << std::endl; return 0; } else { //Q->size=0; Q->Queue[Q->size] = data; //入隊了隊列長度就要增加 Q->size++; return 1; } } //出隊 int Pop(PriQueue *Q, DataType *A) { DataType min; //最小的開始,排序 int minIndex = 0; //短做業優先法 //喝水,先判斷杯子有沒有水 if (Q->size <= 0) { std::cout << "爲空,沒法出隊" << std::endl; return 0; } else { //假設第一個做業是最短的 min = Q->Queue[0]; //1 for (int i = 1; i < Q->size; i++) { //多了一個數據項 按照權值排序 //0 if (Q->Queue[i].priority < min.priority) { min = Q->Queue[i]; minIndex = i; //出隊依據就是最小做業序號 } } *A = Q->Queue[minIndex]; //難點 //刪除完數組後,後面的元素往前移動 for (int i = minIndex + 1; i < Q->size; i++) { Q->Queue[i - 1] = Q->Queue[i]; minIndex = i; } Q->size--; return 1; } } //獲取隊頭元素 int GetQueue(PriQueue *Q, DataType *A) { DataType min; //最小的開始,排序 int minIndex = 0; //短做業優先法 //喝水,先判斷杯子有沒有水 if (Q->size <= 0) { std::cout << "爲空,沒法出隊" << std::endl; return 0; } else { //假設第一個做業是最短的 min = Q->Queue[0]; //1 for (int i = 1; i < Q->size; i++) { //多了一個數據項 按照權值排序 //0 if (Q->Queue[i].priority < min.priority) { min = Q->Queue[i]; minIndex = i; //出隊依據就是最小做業序號 } } *A = Q->Queue[minIndex]; return 1; } }
但願對你們有幫助!
另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!
C語言C++編程學習交流圈子,QQ羣1095293493【點擊進入】微信公衆號:C語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習軟件分享:
編程學習視頻分享: