選服務(wù)好的網(wǎng)站建設(shè)公司廣州私人做網(wǎng)站
提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
文章目錄
前言
一、隊(duì)列
1.1隊(duì)列的概念及結(jié)構(gòu)
二、隊(duì)列的實(shí)現(xiàn)
2.1頭文件的實(shí)現(xiàn)—Queue.h
2.2源文件的實(shí)現(xiàn)—Queue.c
2.3源文件的測(cè)試—test.c
三、測(cè)試隊(duì)列實(shí)際數(shù)據(jù)的展示
3.1正常隊(duì)列的出入
3.2入隊(duì)列的同時(shí)存在出隊(duì)列
總結(jié)
前言
世上有兩種耀眼的光芒,一種是正在升起的太陽,一種是正在努力學(xué)習(xí)編程的你!一個(gè)愛學(xué)編程的人。各位看官,我衷心的希望這篇博客能對(duì)你們有所幫助,同時(shí)也希望各位看官能對(duì)我的文章給與點(diǎn)評(píng),希望我們能夠攜手共同促進(jìn)進(jìn)步,在編程的道路上越走越遠(yuǎn)!
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、隊(duì)列
1.1隊(duì)列的概念及結(jié)構(gòu)
隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out)
入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾
出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭
二、隊(duì)列的實(shí)現(xiàn)
隊(duì)列(先進(jìn)先出)有三種實(shí)現(xiàn)方案:數(shù)組、單向鏈表、雙向鏈表
數(shù)組:隊(duì)列是對(duì)尾入,對(duì)頭出,但是數(shù)組尾插還可以,但是頭刪還得挪動(dòng)數(shù)據(jù),所以非常不方便的
單鏈表:單鏈表尾插入隊(duì)列方便,頭刪也方便
2.1頭文件的實(shí)現(xiàn)—Queue.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int QDataType;typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;//尾入(*單向鏈表,我們要找尾,進(jìn)行尾插,所以我們需要把頭節(jié)點(diǎn)和尾節(jié)點(diǎn)的指針傳進(jìn)來,
//但是要進(jìn)行頭刪,得頻繁改變第一個(gè)節(jié)點(diǎn)得地址,所以我們得用二級(jí)指針,這樣就更麻煩了)
//void QueuePush(QNode* phead,QNode* ptail, QDataType x);
頭出
//void QueuePop(QNode* phead);typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//尾入(我們把第一個(gè)節(jié)點(diǎn)和尾節(jié)點(diǎn)放入一個(gè)結(jié)構(gòu)體中,
//然后可以改變結(jié)構(gòu)體成員,就可以實(shí)現(xiàn)第一個(gè)節(jié)點(diǎn)地址的頻繁的更換)
void QueuePush(Queue* pq, QDataType x);
//頭出
void QueuePop(Queue* pq);//初始化
void QueueInit(Queue* pq);
//銷毀
void QueueDestroy(Queue* pq);//取隊(duì)頭的數(shù)據(jù)
QDataType QueueFront(Queue* pq);
//取隊(duì)尾的數(shù)據(jù)
QDataType QueueBack(Queue* pq);//獲取隊(duì)列中有效元素個(gè)數(shù)
int QueueSize(Queue* pq);
//檢測(cè)隊(duì)列是否為空,如果為空返回非零結(jié)果,如果非空返回0
bool QueueEmpty(Queue* pq);
2.2源文件的實(shí)現(xiàn)—Queue.c
#define _CRT_SECURE_NO_WARNINGS 1#include "queue.h"//尾入(我們把第一個(gè)節(jié)點(diǎn)和尾節(jié)點(diǎn)放入一個(gè)結(jié)構(gòu)體中,
//然后可以改變結(jié)構(gòu)體成員,就可以實(shí)現(xiàn)第一個(gè)節(jié)點(diǎn)地址的頻繁的更換)
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->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
//頭出
void QueuePop(Queue* pq)
{assert(pq);//如果只剩一個(gè)節(jié)點(diǎn)的時(shí)候,phead往后走,此時(shí)ptail就是野指針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--;
}//初始化
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;
}//取隊(duì)頭的數(shù)據(jù)
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
//取隊(duì)尾的數(shù)據(jù)
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}//獲取隊(duì)列中有效元素個(gè)數(shù)
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//檢測(cè)隊(duì)列是否為空,如果為空返回非零結(jié)果,如果非空返回0
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}
2.3源文件的測(cè)試—test.c
#include "queue.h"int main()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);QueuePush(&q, 5);while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}QueueDestroy(&q);return 0;
}
三、測(cè)試隊(duì)列實(shí)際數(shù)據(jù)的展示
1、出入隊(duì)列的方式:隊(duì)尾插入數(shù)據(jù),對(duì)頭刪除數(shù)據(jù)
2、出隊(duì)列和入隊(duì)列的關(guān)系:一對(duì)一的
3.1正常隊(duì)列的出入
3.2入隊(duì)列的同時(shí)存在出隊(duì)列
總結(jié)
好了,本篇博客到這里就結(jié)束了,如果有更好的觀點(diǎn),請(qǐng)及時(shí)留言,我會(huì)認(rèn)真觀看并學(xué)習(xí)。
不積硅步,無以至千里;不積小流,無以成江海。