亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實現隊列的示例詳解

 更新時間:2022年06月29日 10:58:51   作者:。菀枯。  
隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進行刪除操作,而在表的后端(tail)進行插入操作。本文將用C語言實現隊列,感興趣的可以了解一下

前言

前一段時間,我們試著用C語言實現了數據結構中的順序表,單鏈表,雙向循環(huán)鏈表,棧。今天我們再用C語言來實現另一種特殊的線性結構:隊列

一. 什么是隊列

隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進行刪除操作,而在表的后端(tail)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

這個隊列就可以理解成我們平時的排隊,先進入的先出去,與我們之前實現的先進后出的棧相反。

二. 使用什么來實現棧

再把上次的圖拿出來,我們看看是用線性表來實現隊列,還是鏈表比較好

不同點順序表鏈表
存儲空間上物理上一定連續(xù)邏輯上連續(xù),但物理上不一定連續(xù)
隨機訪問可以直接訪問任何元素必須從頭節(jié)點開始往后尋找
任意位置插入或刪除元素要搬移其他的元素,效率低。只需要修改節(jié)點的指針指向,效率高
插入動態(tài)順序表,當空間不夠時需要擴容無容量概念,需要就申請,不用就釋放
應用場景元素高效存儲,并且需要頻繁訪問需要在任意位置插入或者刪除頻繁

綜合上表來看,我覺得鏈表較為方便,原因如下:

1.隊列有多少元素不確定,鏈表可以做到需要就申請,不用就釋放,較為方便

2.隊列是先進先出,順序固定,不需要隨機訪問。

三. 隊列的實現

3.1頭文件

1.包含的標準庫

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

2.定義結構體

typedef int QDateType;//隊列存儲數據類型

typedef struct QueueNode //隊列元素節(jié)點
{
	QDateType val;
	struct QueueNode* next;
}QueueNode;

typedef	struct Queue //隊列
{
	QueueNode* head;
	QueueNode* tail;
}Queue;

3.函數聲明

void QueueInti(Queue* pq);
// 隊列初始化
void QueueDestory(Queue* pq);
// 隊列的銷毀
void QueuePush(Queue* pq, QDateType x);
// 入隊
void QueuePop(Queue* pq);
// 出隊
QDateType QueueFront(Queue* pq);
// 取出隊首元素
int QueueSize(Queue* pq);
// 求隊列的長度
bool QueueEmpty(Queue* pq);
// 判斷隊是否為空

3.2 函數的實現

1.隊列的初始化

將頭尾置為空指針即可。

void QueueInti(Queue* pq)
{
    assert(pq); //防止pq為空指針
    pq->head = pq->tail = NULL;
}

2.隊列的銷毀

遍歷隊列元素,然后將每一個元素釋放。

void QueueDestory(Queue* pq)
{
    assert(pq); //防止pq為空指針
    QueueNode* cur = pq->head;
    while (cur)
    {
        QueueNode* next = cur->next;
        free(cur);
        cur = next;
    }
    pq->tail = pq->head = NULL;
}

3.入隊

對于入隊,我們首先需要去開辟一個新的節(jié)點來存儲數據,然后將這個節(jié)點加入到tail后即可。此時我們就要分別考慮。

1.如果為空隊列,那么我們不僅要改變tail,還要改變head的值

2.如果不為空隊列,只用改變tail即可。

void QueuePush(Queue* pq, QDateType x)
{
	assert(pq); //防止pq為空指針

	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
	if (NULL == newNode)
	{
		printf("malloc error\n");
		exit(-1);
	}
	newNode->val = x;
	newNode->next = NULL;//開辟一個新節(jié)點存儲數據

	if (pq->tail == NULL)//判斷是否為空隊列
	{
		assert(pq->head == NULL);
		pq->head = pq->tail = newNode;
	}
	else
	{
		pq->tail->next = newNode;
		pq->tail = newNode;
	}
}

4.出隊

對于出隊,我們同樣需要考慮兩種情況

  • 隊列為空,改變head的同時改變tail
  • 隊列不為空,改變head即可。
void QueuePop(Queue* pq)
{
    assert(pq);//防止pq為空指針
    assert(pq->head && pq->tail); //防止隊列為空隊列
    if (pq->head->next == NULL)
    {
        free(pq->head);
        pq->head = pq->tail = NULL;
    }
    else
    {
        QueueNode* next = pq->head->next;
        free(pq->head);
        pq->head = next;
    }
}

5. 取出隊首元素

沒啥說的,直接訪問頭節(jié)點取出即可

QDateType QueueFront(Queue* pq)
{
    assert(pq);//防止pq為空指針
    assert(pq->head && pq->tail); //防止隊列為空隊列

    return pq->head->val;
}

6.判斷是否為空隊列

我們只需要判斷頭指針是否為NULL,如果是則為空

bool QueueEmpty(Queue* pq)
{
    assert(pq);

    return pq->head == NULL;
}

7. 求隊伍長度

創(chuàng)建一個變量,遍歷隊伍求長度。

int QueueSize(Queue* pq)
{
    assert(pq);
    QueueNode* cur = pq->head;
    int count = 0;
    while (cur)
    {
        cur = cur->next;
        count++;
    }
    return count;
}

四.完整代碼

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef int QDateType;

typedef struct QueueNode
{
	QDateType val;
	struct QueueNode* next;
}QueueNode;

typedef	struct Queue
{
	QueueNode* head;
	QueueNode* tail;
}Queue;

void QueueInti(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}

void QueueDestory(Queue* pq)
{
	assert(pq);
	QueueNode* cur = pq->head;
	while (cur)
	{
		QueueNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->tail = pq->head = NULL;
}

void QueuePush(Queue* pq, QDateType x)
{
	assert(pq);

	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
	if (NULL == newNode)
	{
		printf("malloc error\n");
		exit(-1);
	}
	newNode->val = x;
	newNode->next = NULL;

	if (pq->tail == NULL)
	{
		assert(pq->head == NULL);
		pq->head = pq->tail = newNode;
	}
	else
	{
		pq->tail->next = newNode;
		pq->tail = newNode;
	}

}

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head && pq->tail);
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QueueNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->head == NULL;
}

QDateType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->head);

	return pq->head->val;
}

int QueueSize(Queue* pq)
{
	assert(pq);
	QueueNode* cur = pq->head;
	int count = 0;
	while (cur)
	{
		cur = cur->next;
		count++;
	}
	return count;
}

以上就是C語言實現隊列的示例詳解的詳細內容,更多關于C語言 隊列的資料請關注腳本之家其它相關文章!

相關文章

  • C++深入探究類與對象之友元與運算符重載

    C++深入探究類與對象之友元與運算符重載

    友元就是讓一個函數或者類,訪問另一個類中的私有成員;打個比方,這相當于是說:朋友是值得信任的,所以可以對他們公開一些自己的隱私,運算符重載的實質就是函數重載或函數多態(tài),運算符重載是一種形式的C++多態(tài),目的在于讓人能夠用同名的函數來完成不同的基本操作
    2022-04-04
  • C語言超詳細分析多進程的概念與使用

    C語言超詳細分析多進程的概念與使用

    在一個項目中并發(fā)執(zhí)行任務時多數情況下都會選擇多線程,但有時候也會選擇多進程,例如可以同時運行n個記事本編輯不同文本,由一個命令跳轉到另外一個命令,或者使用不同進程進行協(xié)作
    2022-08-08
  • C++ OpenCV實現白平衡之灰度世界算法

    C++ OpenCV實現白平衡之灰度世界算法

    灰度世界算法是白平衡各種算法中最基本的一種。本文將利用C++和OpenCV實現白平衡中的灰度世界算法,文中示例代碼講解詳細,感興趣的可以了解一下
    2022-05-05
  • 基于ios中的流狀態(tài)的定義分析

    基于ios中的流狀態(tài)的定義分析

    本篇文章介紹了,基于ios中的流狀態(tài)的定義分析。需要的朋友參考下
    2013-05-05
  • c語言處理函數調用的方法

    c語言處理函數調用的方法

    函數就是一段封裝好的,可以重復使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復的代碼。這篇文章主要介紹了c語言是如何處理函數調用的?需要的朋友可以參考下
    2021-11-11
  • C/C++代碼操作MySQL數據庫詳細步驟

    C/C++代碼操作MySQL數據庫詳細步驟

    這篇文章主要給大家介紹了關于C/C++代碼操作MySQL數據庫的相關資料,通過文中的這些示例,我們可以連接到MySQL數據庫,并執(zhí)行常見的數據庫操作,如創(chuàng)建表、插入數據和查詢數據,需要的朋友可以參考下
    2023-12-12
  • 關于vector迭代器失效的幾種情況總結

    關于vector迭代器失效的幾種情況總結

    下面小編就為大家?guī)硪黄P于vector迭代器失效的幾種情況總結。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 基于Qt實現日志打印系統(tǒng)

    基于Qt實現日志打印系統(tǒng)

    這篇文章主要為大家詳細介紹了如何利用Qt開發(fā)一個日志打印系統(tǒng),可以實現打印日志按日期、大小保存,過期刪除,窗口實時顯示日志,網絡傳輸日志遠程調試,需要的可以參考下
    2023-12-12
  • 深入理解C語言中使用頻率較高的指針與數組

    深入理解C語言中使用頻率較高的指針與數組

    在C語言中要說到哪一部分最難搞,首當其沖就是指針,指針永遠是個讓人又愛又恨的東西,用好了可以事半功倍,用不好就會有改不完的bug和通不完的宵,下面這篇文章主要給大家介紹了關于C語言中使用頻率較高的指針與數組的相關資料,需要的朋友可以參考下
    2022-03-03
  • C語言 一級指針與二級指針詳細介紹

    C語言 一級指針與二級指針詳細介紹

    這篇文章主要介紹了C語言 一級指針與二級指針詳細介紹的相關資料,需要的朋友可以參考下
    2016-10-10

最新評論