欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言結(jié)構(gòu)及隊列實現(xiàn)示例詳解

 更新時間:2023年12月22日 08:48:08   作者:Hhh_灝  
這篇文章主要為大家介紹了C語言實現(xiàn)隊列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1.隊列的概念及結(jié)構(gòu)

隊列:

只允許一端插入數(shù)據(jù),另一端刪除數(shù)據(jù)的特殊線性表

先進(jìn)先出FIFO(First In First Out)

入隊列:

進(jìn)行插入操作的一端稱為隊尾

出隊列:

進(jìn)行刪除操作的一端稱為隊頭

2. 隊列的實現(xiàn)

隊列也可以數(shù)組和鏈表的結(jié)構(gòu)實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組的結(jié)構(gòu),出隊列在數(shù)組頭上出數(shù)據(jù),效率會比較低。

DFS---深度優(yōu)先遍歷 -- 遞歸/棧實現(xiàn)非遞歸

BFS---廣度優(yōu)先遍歷 -- 隊列

// 鏈?zhǔn)浇Y(jié)構(gòu):表示隊列
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
typedef int QDatatype;
typedef struct QueueNode
{
    QDatatype data;
    struct QueueNode* next;
}QNode;
typedef struct Queue
{
    QNode* phead;
    QNode* ptail;
    int size;
}Queue;
//初始化隊列
void QueueInit(Queue* pq);
//隊尾入隊列
void QueuePush(Queue* pq , QDatatype x);
//隊頭出隊列
void QueuePop(Queue* pq);
//獲取隊頭元素
QDatatype QueueFront(Queue* pq);
//獲取隊尾元素
QDatatype QueueBack(Queue* pq);
//隊列大小
int QueueSize(Queue* pq);
//判斷隊列是否為空
bool QueueEmpty(Queue* pq);
//銷毀隊列
void QueueDestory(Queue* pq);
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
//初始化隊列
void QueueInit(Queue* pq)
{
    assert(pq);
    pq->phead = NULL;
    pq->ptail = NULL;
    pq->size = 0;
}
//銷毀隊列
void QueueDestory(Queue* pq)
{
    QNode* cur = pq->phead ;
    while (cur)
    {
        /*QNode* tmp = cur;
        cur = cur->next;
        free(tmp);*/
        QNode* next = cur->next;
        free(cur);
        cur = next;
    }
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}
//隊尾入隊列
void QueuePush(Queue* pq, QDatatype x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        perror("malloc");
        return;
    }
    newnode->data = x;
    newnode->next = NULL;
    if (pq->phead == NULL)//isEmpty
    {
        assert(pq->ptail==NULL);
        pq->phead = newnode;
        pq->ptail = newnode;
    }
    else
    {
        pq->ptail->next = newnode;
        pq->ptail = newnode;
    }
    pq->size++;
}
//判斷隊列是否為空
bool QueueEmpty(Queue* pq)
{
    assert(pq);
    return pq->size == 0;
    //return pq->phead == NULL && pq->ptail == NULL;
}
//隊頭出隊列
void QueuePop(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));//assert(pq->phead != NULL);
    //1、一個節(jié)點
    //2、多個節(jié)點
    if (pq->phead->next == NULL)//一個節(jié)點要注意ptail別弄成野指針
    {
        free(pq->phead);
        pq->phead = pq->ptail = NULL;
    }
    else
    {
        Queue* next = pq->phead->next;
        free(pq->phead);
        pq->phead = next;
    }
    pq->size--;
}
//獲取隊頭元素
QDatatype QueueFront(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->phead->data;
}
//獲取隊尾元素
QDatatype QueueBack(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->ptail->data;
}
//隊列大小
int QueueSize(Queue* pq)
{
    assert(pq);
    return pq->size;
}
//測試
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
void TestQueue()
{
    Queue q;
    QueueInit(&q);
    QueuePush(&q, 1);
    QueuePush(&q, 2);
    QueuePush(&q, 3);
    QueuePush(&q, 4);
    //QueuePop(&q);
    //QueuePop(&q);
    //QueuePop(&q);
    //while (!QueueEmpty(&q))
    //{
    //    printf("%d ", QueueFront(&q));
    //    
    //    QueuePop(&q);
    //}
    printf("\n"); 
    //printf("%d ", QueueFront(&q));
    //printf("%d ", QueueSize(&q));
    //QueuePop(&q);
    printf("%d ", QueueBack(&q));
    printf("%d ", QueueBack(&q));
    printf("%d ", QueueBack(&q));
    QueueDestory(&q);
}
int main()
{
    TestQueue();
    return 0;
}

以上就是C語言結(jié)構(gòu)及隊列實現(xiàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言結(jié)構(gòu)隊列的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++?std::thread?使用方法

    C++?std::thread?使用方法

    這篇文章主要介紹了C++?std::thread?如何使用,C++中的std::thread類提供了一種方便的多線程編程方式,在使用std::thread類時,我們需要注意線程間的同步和通信問題,以確保多個線程之間的正確協(xié)同工作需要的朋友可以參考下
    2023-03-03
  • C語言 動態(tài)內(nèi)存分配詳解

    C語言 動態(tài)內(nèi)存分配詳解

    這篇文章主要介紹了C語言 動態(tài)內(nèi)存分配詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 手把手教你實現(xiàn)漂亮的Qt?登錄界面

    手把手教你實現(xiàn)漂亮的Qt?登錄界面

    最近在使用Qt5,Qt?Creator做一個管理系統(tǒng)類的項目,需要用到登錄界面,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 基于C++17實現(xiàn)的手寫線程池

    基于C++17實現(xiàn)的手寫線程池

    本文主要介紹了基于C++17實現(xiàn)的手寫線程池,自己實現(xiàn)了Any類,Semaphore類以及Result類的開發(fā),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • C++20 統(tǒng)一容器擦除:std::erase 和 std::eraseif的實現(xiàn)

    C++20 統(tǒng)一容器擦除:std::erase 和 std::eraseif的實現(xiàn)

    本文主要介紹了C++20 統(tǒng)一容器擦除:std::erase 和 std::erase_if的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • C語言設(shè)計前中后隊列實例代碼

    C語言設(shè)計前中后隊列實例代碼

    隊列最主要的作用就是用來管理數(shù)據(jù)流的,防止數(shù)據(jù)因為傳輸頻率過快得不到及時處理而丟失,下面這篇文章主要給大家介紹了關(guān)于C語言設(shè)計前中后隊列的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • C++?指針和對象成員訪問的區(qū)別:`.`?與?`->`?的使用小結(jié)

    C++?指針和對象成員訪問的區(qū)別:`.`?與?`->`?的使用小結(jié)

    在學(xué)習(xí)?C++?時,常常會遇到訪問對象成員的兩種符號:.?和?->,這兩個符號看似簡單,但它們的正確使用卻需要理解指針和對象的本質(zhì)差異,本文介紹C++?指針和對象成員訪問的區(qū)別:`.`?與?`->`?的使用指南,感興趣的朋友一起看看吧
    2024-12-12
  • 淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法

    淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法

    這篇文章主要介紹了淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法,注意其將字符串轉(zhuǎn)換成long型的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • 使用C++實現(xiàn)工資管理中的隨機(jī)教師信息生成功能

    使用C++實現(xiàn)工資管理中的隨機(jī)教師信息生成功能

    這篇文章主要介紹了使用C++實現(xiàn)工資管理中的隨機(jī)教師信息生成功能,想要做一個教師工資管理系統(tǒng),就必須得準(zhǔn)備好數(shù)據(jù),但是這些數(shù)據(jù)如果用手一行一行地敲,那么工作量是非常大的,因此,我就產(chǎn)生了用C語言實現(xiàn)直接生成大量的教師基本信息的想法,需要的朋友可以參考下
    2023-05-05
  • C++ OpenCV繪制幾何圖形

    C++ OpenCV繪制幾何圖形

    這篇文章主要為大家詳細(xì)介紹了C++ OpenCV繪制幾何圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評論