在此以前,已經瞭解過順序表和鏈表了,那麼如今要了解的棧和隊列,從本質上來講是基於上述倆個的,棧講究「」後進先出」,而隊列與之不一樣,要求「先進先出」,對於棧來講,根據規則,咱們瞭解到,棧的「入棧」即爲「尾插」,棧的出棧也要找到「尾數據」,考慮到實用性,咱們的「棧「是基於順序表完成的。這裏就不細細展開了,而對於本次要講的「隊列」,根據使用規則,會發現,入隊列相似「尾插」,出隊列是「首」,所以,爲了效率而言,「隊列」會和單鏈表(此單鏈表具備尾指針,有尾指針彌補「尾插」效率)聯繫起來
下面咱們來完成一個簡單但通用的「隊列」
1.首先呢,爲了方便操做,咱們創建一個本身的頭文件·,(這個頭文件後面會有引用),命名爲 queue.h,顧名思義;node
#pragma once #include <stdlib.h> #include <stdio.h> typedef int QDataType; typedef struct QNode//建立一個結構體來放須要用到的Node { struct QNode* _next;//本身的指針 QDataType _data; }QNode; typedef struct Queue { QNode* _front;//首 QNode* _rear;/尾 QNode* _size;//此處size的建立便於後面檢查隊列滿與空 }Queue; void queueInit(Queue* q);//初始化一個隊列 QNode* creatNode(QDataType data);//本身想使用的數據 void queuePush(Queue* q, QDataType data);//入隊列 void queuePop(Queue* q);//出隊列 QDataType queueFront(Queue* q)//獲取頭; QDataType queueBack(Queue* q);//獲取尾 int queueSize(Queue* q);//多大 int queueEmpty(Queue* q);//判空 void queueDestory(Queue* q);//銷燬
2,這裏是咱們完成所須要的的函數的主要完成區域,我命名爲 Queue.c,在這裏完成函數,爲test引用作準備;
#define _CRT_SECURE_NO_WARNINGS 1 #include "queue.h" void queueInit(Queue* q) { q->_front = q->_rear = NULL; q->_size = 0; } QNode* creatNode(QDataType data) { QNode* node = (QNode*)malloc(sizeof(QNode)); node->_data = data; node->_next = NULL; return node; } void queuePush(Queue* q,QDataType data) { QNode* node = creatNode(data); if (q->_front == NULL) q->_front = q->_rear = node; else { q->_rear->_next = node; q->_rear = node; ++q->_size; } } void queuePop(Queue* q) { /*if (q->_front == NULL) return; if (q->_front == q->_rear) { q->_front = q ->_rear = NULL; } else{ QNode* next = q->_front; free(q->_front); q->_front = next; }*/ if (q->_front) { QNode* next = q->_front->_next; free(q->_front); q->_front = next; if (q->_front == NULL) q->_rear = NULL; --q->_size; } } QDataType queueFront(Queue* q) { /*if (q->_front == NULL) return "NULL";*/ return q->_front->_data; } QDataType queueBack(Queue* q) { return q->_rear->_data; } int queueSize(Queue* q) { return q->_size; } int queueEmpty(Queue* q) { if (q->_front == NULL) return 1; return 0; } void queueDestory(Queue* q) { QNode* cur = q->_front; while (cur) { QNode* next = cur->_next; free(cur); cur = next; } q->_front = q->_rear = NULL; q->_size = 0; }
3,這裏是咱們本身的操做區域哈哈,經過測試函數test來檢測你寫函數是否可用,這裏我只展現部分,其他的操做能夠本身按照需求加上去;ide
#define _CRT_SECURE_NO_WARNINGS 1 #include "queue.h" void test1() { Queue q; queueInit(&q); queuePush(&q, 1);//接口處傳&q,傳的是已經建立好的隊列,數字即爲data, queuePush(&q, 2); queuePush(&q, 3); queuePush(&q, 4); queuePop(&q); queuePop(&q); queuePop(&q); queuePop(&q); } int main() { test1(); return 0; }