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

C語(yǔ)言詳解鏈?zhǔn)疥?duì)列與循環(huán)隊(duì)列的實(shí)現(xiàn)

 更新時(shí)間:2022年04月15日 15:53:21   作者:m0_52012656  
隊(duì)列(Queue)與棧一樣,是一種線性存儲(chǔ)結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First In First Out)的原則,簡(jiǎn)稱FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素,本篇來(lái)講解鏈?zhǔn)疥?duì)列與循環(huán)隊(duì)列的實(shí)現(xiàn)

隊(duì)列的實(shí)現(xiàn)

隊(duì)列是一種先進(jìn)先出(First in First Out)的線性表,簡(jiǎn)稱FIFO。與棧不同,棧是一種后進(jìn)先出(先進(jìn)后出)的線性表。在隊(duì)列中,允許插入的一端稱為隊(duì)尾,允許刪除的一端稱為隊(duì)頭。假設(shè)隊(duì)列是q=(a1,a2,…,an),那么a1就是隊(duì)頭元素,而an是隊(duì)尾元素。這樣我們就可以刪除時(shí),總是從a1開(kāi)始,而插入時(shí),列在最后。這也比較符合我們通常生活中的習(xí)慣,排在第一個(gè)的優(yōu)先出列,最后來(lái)的當(dāng)然在隊(duì)伍的最后。隊(duì)列分為順序隊(duì)列和循環(huán)隊(duì)列。順序隊(duì)列我們可以利用數(shù)組或者鏈表實(shí)現(xiàn)。這里,我們選擇用鏈表實(shí)現(xiàn)順序隊(duì)列。

今天主要介紹鏈表實(shí)現(xiàn)的隊(duì)列和循環(huán)隊(duì)列

鏈?zhǔn)疥?duì)列

隊(duì)列主要有哪些基本操作

// 初始化隊(duì)列 
void QueueInit(Queue* q);
?
// 隊(duì)尾入隊(duì)列 
void QueuePush(Queue* q, QDataType data);
// 隊(duì)頭出隊(duì)列 
void QueuePop(Queue* q);
// 獲取隊(duì)列頭部元素 
QDataType QueueFront(Queue* q);
// 獲取隊(duì)列隊(duì)尾元素 
QDataType QueueBack(Queue* q);
// 獲取隊(duì)列中有效元素個(gè)數(shù) 
int QueueSize(Queue* q);
// 檢測(cè)隊(duì)列是否為空,如果為空返回非零結(jié)果,如果非空返回0 
bool QueueEmpty(Queue* q);
// 銷毀隊(duì)列 
void QueueDestroy(Queue* q);

鏈?zhǔn)疥?duì)列的定義

typedef int QDataType;
// 鏈?zhǔn)浇Y(jié)構(gòu):表示隊(duì)列 
typedef struct QListNode
{
    struct QListNode* _next;
    QDataType _data;
}QNode;
?
// 隊(duì)列的結(jié)構(gòu) 
typedef struct Queue
{
    QNode* _front;
    QNode* _rear;
}Queue;

鏈?zhǔn)疥?duì)列的實(shí)現(xiàn)

1、初始化隊(duì)列

void QueueInit(Queue* q)
{
    assert(q);
    q->_front = NULL;
    q->_rear = NULL;
}

2、銷毀隊(duì)列

void QueueDestroy(Queue* q)
{
    assert(q);
    QNode* cur = q->_front;
    while (cur != NULL)
    {
        QNode* next = cur->_next;
        free(cur);
        cur = next;
    }
    q->_front = q->_rear = NULL;
}

3、隊(duì)列判空

bool QueueEmpty(Queue* q)
{
    assert(q);
    //if (q->_front == NULL)
    //{
    //  return 1;
    //}
    //else
    //{
    //  return 0;
    //}
    return q->_front == NULL;
}

4、入隊(duì)操作

void QueuePush(Queue* q, QDataType data)
{
    assert(q);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        exit(-1);
    }
    newnode->_data = data;
    newnode->_next = NULL;
    if (q->_front == NULL)
    {
        q->_front = q->_rear = newnode;
    }
    else
    {
        q->_rear->_next = newnode;
        q->_rear = newnode;
    }
}

5、出隊(duì)操作

void QueuePop(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));
    QNode* next = q->_front->_next;
    free(q->_front);
    q->_front = next;
    if (q->_front == NULL)
    {
        q->_rear = NULL;
    }
}

6、取隊(duì)頭元素

QDataType QueueFront(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));
    return q->_front->_data;
}

7、取隊(duì)尾操作

QDataType QueueBack(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));
    return q->_rear->_data;
}

8、隊(duì)中有效元素個(gè)數(shù)

int QueueSize(Queue* q)
{
    assert(q);
    int size = 0;
    QNode* cur = q->_front;
    while (cur) 
    {
        size++;
        cur = cur->_next;
    }
    return size;
}

循環(huán)隊(duì)列

循環(huán)隊(duì)列的定義

循環(huán)隊(duì)列就是將隊(duì)列存儲(chǔ)空間的最后一個(gè)位置繞到第一個(gè)位置,形成邏輯上的環(huán)狀空間,供隊(duì)列循環(huán)使用。在循環(huán)隊(duì)列結(jié)構(gòu)中,當(dāng)存儲(chǔ)空間的最后一個(gè)位置已被使用而再要進(jìn)入隊(duì)運(yùn)算時(shí),只需要存儲(chǔ)空間的第一個(gè)位置空閑,便可將元素加入到第一個(gè)位置,即將存儲(chǔ)空間的第一個(gè)位置作為隊(duì)尾。循環(huán)隊(duì)列可以更簡(jiǎn)單防止偽溢出的發(fā)生,但隊(duì)列大小是固定的。在循環(huán)隊(duì)列中,當(dāng)隊(duì)列為空時(shí),有front=rear,而當(dāng)所有隊(duì)列空間全占滿時(shí),也有front=rear。為了區(qū)別這兩種情況,規(guī)定循環(huán)隊(duì)列最多只能有MaxSize-1個(gè)隊(duì)列元素,當(dāng)循環(huán)隊(duì)列中只剩下一個(gè)空存儲(chǔ)單元時(shí),隊(duì)列就已經(jīng)滿了。因此,隊(duì)列判空的條件是front=rear,而隊(duì)列判滿的條件是front=(rear+1)%MaxSize。

循環(huán)隊(duì)列的空間可以重復(fù)利用,解決了普通隊(duì)列的空間浪費(fèi)問(wèn)題

循環(huán)隊(duì)列的實(shí)現(xiàn)

typedef struct {
    int *a;
    int front;
    int tail;
    int k;
} MyCircularQueue;
?
//提前聲明判空判滿
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);
//創(chuàng)建循環(huán)隊(duì)列
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* cq=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    cq->a=(int*)malloc(sizeof(int)*(k+1));
    cq->front=cq->tail=0;
    cq->k=k;
    return cq;
}
//循環(huán)隊(duì)列入隊(duì)
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj)){
        return false;
    }
    obj->a[obj->tail]=value;
    obj->tail++;
    obj->tail%=(obj->k+1);
?
    return true;
}
//循環(huán)隊(duì)列出隊(duì)
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)){
        return false;
    }
    obj->front++;
    obj->front%=(obj->k+1);
    return true;
?
}
//循環(huán)隊(duì)列取隊(duì)頭
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)){
        return -1;
    }
    return obj->a[obj->front];
}
//循環(huán)隊(duì)列取隊(duì)尾
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)){
        return -1;
    }
    int i=(obj->tail+obj->k)%(obj->k+1);
    return obj->a[i];
}
//循環(huán)隊(duì)列判空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front==obj->tail;
}
//循環(huán)隊(duì)列判滿
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->tail+1)%(obj->k+1)==obj->front;
}
//銷毀循環(huán)隊(duì)列
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}

到此這篇關(guān)于C語(yǔ)言詳解鏈?zhǔn)疥?duì)列與循環(huán)隊(duì)列的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言 隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入分析:C++模板究竟會(huì)使代碼膨脹嗎

    深入分析:C++模板究竟會(huì)使代碼膨脹嗎

    今天和同事說(shuō)到C++模板會(huì)使代碼膨脹, 可同事覺(jué)得不會(huì)。 同事的依據(jù)是: 如果模板會(huì)使代碼膨脹, 那么ATL和WTL里為什么還要大量使用模板? 同樣功能 ,ATL和WTL編譯出的可執(zhí)行文件可比MFC編譯的要小的多
    2013-04-04
  • c++利用stl set_difference對(duì)車輛進(jìn)出區(qū)域進(jìn)行判定

    c++利用stl set_difference對(duì)車輛進(jìn)出區(qū)域進(jìn)行判定

    這篇文章主要介紹了set_difference,用于求兩個(gè)集合的差集,結(jié)果集合中包含所有屬于第一個(gè)集合但不屬于第二個(gè)集合的元素,需要的朋友可以參考下
    2017-03-03
  • C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹(shù)實(shí)例詳解

    C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹(shù)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)平衡二叉樹(shù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c++實(shí)現(xiàn)二叉查找樹(shù)示例

    c++實(shí)現(xiàn)二叉查找樹(shù)示例

    這篇文章主要介紹了c++實(shí)現(xiàn)二叉查找樹(shù)示例,實(shí)現(xiàn)二叉查找樹(shù)的基本功能,需要的朋友可以參考下
    2014-02-02
  • Qt利用QDrag實(shí)現(xiàn)拖拽拼圖功能詳解

    Qt利用QDrag實(shí)現(xiàn)拖拽拼圖功能詳解

    QDrag類為MIME-based拖拽數(shù)據(jù)轉(zhuǎn)換提供支持。本文為大家主要介紹如何利用QDrag類實(shí)現(xiàn)拖拽拼圖功能。左邊是打散的圖,拖動(dòng)到右邊進(jìn)行復(fù)現(xiàn),此外程序還支持手動(dòng)拖入原圖片,感興趣的可以了解一下
    2022-07-07
  • 在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼

    在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼

    最近的項(xiàng)目在用c處理后臺(tái)的數(shù)據(jù)時(shí),因?yàn)楹枚嗤獠拷涌诙荚谑褂肑son格式作為返回的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)描述,如何在c中高效使用和處理Json格式的數(shù)據(jù)就成為了必須要解決的問(wèn)題,需要的朋友可以參考下
    2023-11-11
  • C語(yǔ)言文件操作函數(shù)freopen詳細(xì)解析

    C語(yǔ)言文件操作函數(shù)freopen詳細(xì)解析

    替換一個(gè)流,或者說(shuō)重新分配文件指針,實(shí)現(xiàn)重定向。如果stream流已經(jīng)打開(kāi),則先關(guān)閉該流。如果該流已經(jīng)定向,則freopen將會(huì)清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開(kāi)一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)出錯(cuò)
    2013-10-10
  • c++ 數(shù)組定義及初始化詳解

    c++ 數(shù)組定義及初始化詳解

    這篇文章主要介紹了c++ 數(shù)組定義及初始化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • C++ map用法總結(jié)(整理)

    C++ map用法總結(jié)(整理)

    這篇文章主要介紹了C++ map用法總結(jié)(整理),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C++實(shí)現(xiàn)大數(shù)相乘的算法

    C++實(shí)現(xiàn)大數(shù)相乘的算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)大數(shù)相乘的算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評(píng)論