最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列示例

 更新時(shí)間:2022年06月06日 10:20:02   作者:jiangwei0512  
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

說(shuō)明

循環(huán)隊(duì)列是一種先進(jìn)先出的,首尾相連的隊(duì)列。

大致的結(jié)構(gòu)如下圖:

用數(shù)組來(lái)抽象的表示一下的話,如下圖:

循環(huán)隊(duì)列有兩個(gè)指針指向數(shù)據(jù),上圖中的start和end就是那兩個(gè)指針,它們指向相同的位置,表示的是空,即隊(duì)列是空的。

隨著數(shù)據(jù)的放入,隊(duì)列一般有下面的兩種形式:

需要注意第二種形式,從圖上看end在start的前面了,但是因?yàn)檠h(huán)關(guān)系,前后并不重要。

另外需要考慮的是隊(duì)列滿的情況:

但這種情況存在一個(gè)問題,即空隊(duì)列和滿隊(duì)列沒有辦法區(qū)分了,end和start都指向了相同的位置。

為了解決這個(gè)問題,一個(gè)方法是空出一個(gè)位置不放數(shù)據(jù),當(dāng)end再加一個(gè)數(shù)據(jù)就等于start的時(shí)候就認(rèn)為隊(duì)列是滿的:

這時(shí)實(shí)際的數(shù)據(jù)長(zhǎng)度就會(huì)比分配的少1。

下面是隊(duì)列中空和滿的判斷:

1. 隊(duì)列為空時(shí):end == start

2. 隊(duì)列為滿時(shí):(end + 1) % size == start

這里的size是指分配的空間大小,而不是隊(duì)列長(zhǎng)度,隊(duì)列的實(shí)際長(zhǎng)度為(end - start + size) % size,最大長(zhǎng)度是size-1

這也是因?yàn)橐紤]循環(huán)的關(guān)系,所以要加上%size這個(gè)操作。

示例代碼

1. 首先定義結(jié)構(gòu)體:

//定義循環(huán)隊(duì)列
typedef struct _LoopQueue {
	int data[8];		//存放數(shù)據(jù)
	int start;		//頭指針
	int end;		//尾指針
} LoopQueue;

2. 定義各種算法:

#define TRUE	1
#define FALSE	0
#define SIZE	8
//初始化隊(duì)列
int init(LoopQueue *lq) {
	lq->start = 0;
	lq->end = 0;
	return TRUE;
}
//判斷隊(duì)列是否為空
int isEmpty(LoopQueue *lq) {
	if (lq->start == lq->end) {
		return TRUE;
	}
	return FALSE;
}
//判斷隊(duì)列是否為滿
int isFull(LoopQueue *lq) {
	if ((lq->end + 1) % SIZE == lq->start) {
		return TRUE;
	}
	return FALSE;
}
//獲取隊(duì)列的長(zhǎng)度
int getLength(LoopQueue *lq) {
	return (lq->end - lq->start + SIZE) % SIZE;
}
//插入數(shù)據(jù)
int pushQueue(LoopQueue *lq, int data) {
	if(isFull(lq)) {
		printf("Queue is full.\n");
		return FALSE;
	}
	lq->data[lq->end] = data;
	lq->end = (lq->end + 1) % SIZE;
	return TRUE;
}
//彈出數(shù)據(jù)
int popQueue(LoopQueue *lq, int *data) {
	if (isEmpty(lq)) {
		printf("Queue is empty.\n");
		return FALSE;
	}
	*data = lq->data[lq->start];
	lq->start = (lq->start + 1) % SIZE;
	return TRUE;
}
//顯示隊(duì)列中的數(shù)據(jù)
void printQueue(LoopQueue *lq) {
	int index;
	int count;
	count = getLength(lq);
	if (0 == count) {
		printf("No data.\n");
		return;
	}
	for (index = 0; index < count; index++) {
		printf("%d ", lq->data[index]);
	}
	printf("\n");
	return;
}

3. 測(cè)試:

int main()
{
	int index;
	int num;
	//隊(duì)列測(cè)試代碼
	LoopQueue *lq = (LoopQueue *)malloc(sizeof(LoopQueue));
	init(lq);
	printQueue(lq);
	for (index = 0; index < SIZE; index ++) {	//注意這里要放8個(gè)數(shù)據(jù),但是實(shí)際上只能放7個(gè),所以最后一個(gè)會(huì)報(bào)錯(cuò)
		pushQueue(lq, index);
	}
	printQueue(lq);
	for (index = 0; index < SIZE; index ++) {	//同上,會(huì)打印一個(gè)錯(cuò)誤
		if (popQueue(lq, &num)) {
			printf("%d\n", num);
		}
	}
	printQueue(lq);
	return 0;
}

4. 最后的結(jié)果:

以上就是C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法循環(huán)隊(duì)列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中BitBlt的使用方法詳解

    C++中BitBlt的使用方法詳解

    這篇文章主要介紹了C++中BitBlt的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++實(shí)現(xiàn)自定義撤銷重做功能的示例代碼

    C++實(shí)現(xiàn)自定義撤銷重做功能的示例代碼

    在使用c++做界面開發(fā)的時(shí)候,尤其是實(shí)現(xiàn)白板功能時(shí)需要自己實(shí)現(xiàn)一套撤銷重做功能.如果是qt則有QUndoable對(duì)象,可以直接拿來(lái)用。但是如果是使用gdi繪圖,則可能需要自己實(shí)現(xiàn)了。本文就來(lái)用C++實(shí)現(xiàn)自定義撤銷重做功能,需要的可以參考一下
    2022-12-12
  • 利用C++實(shí)現(xiàn)簡(jiǎn)易的.ini配置文件解析器

    利用C++實(shí)現(xiàn)簡(jiǎn)易的.ini配置文件解析器

    這篇文章主要為大家詳細(xì)介紹了如何基于C++編寫一個(gè)簡(jiǎn)易的.ini配置文件解析器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C/C++經(jīng)典楊輝三角問題解決方案

    C/C++經(jīng)典楊輝三角問題解決方案

    楊輝三角形,又稱帕斯卡三角形、賈憲三角形、海亞姆三角形,它的排列形如三角形。本文將為大家介紹通過C++/C語(yǔ)言實(shí)現(xiàn)打印楊輝三角形的示例代碼,需要的可以參考一下
    2023-02-02
  • C++的dynamic示例代碼詳解

    C++的dynamic示例代碼詳解

    在C++編程中,dynamic_cast 是處理多態(tài)類型轉(zhuǎn)換的關(guān)鍵工具,允許在復(fù)雜繼承結(jié)構(gòu)中安全地將基類指針或引用轉(zhuǎn)換為派生類指針或引用,這篇文章主要介紹了C++的dynamic,需要的朋友可以參考下
    2024-08-08
  • C++內(nèi)存分區(qū)模型超詳細(xì)講解

    C++內(nèi)存分區(qū)模型超詳細(xì)講解

    在了解內(nèi)存分區(qū)之前,我們先來(lái)聊一聊為什么要進(jìn)行內(nèi)存分區(qū)。在進(jìn)行了內(nèi)存分區(qū)之后,在不同的區(qū)域存放的數(shù)據(jù),會(huì)有不同的生命周期,從而會(huì)讓程序員的編程變得更加靈活
    2022-11-11
  • C語(yǔ)言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)

    C語(yǔ)言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)

    qsort函數(shù)是由C語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù)函數(shù), 它的實(shí)現(xiàn)思想是快速排序。這篇文章主要介紹了C語(yǔ)言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下
    2022-10-10
  • C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例

    C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例

    今天小編就為大家分享一篇關(guān)于C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 淺談C++高并發(fā)場(chǎng)景下讀多寫少的優(yōu)化方案

    淺談C++高并發(fā)場(chǎng)景下讀多寫少的優(yōu)化方案

    本文主要介紹了淺談C++高并發(fā)場(chǎng)景下讀多寫少的優(yōu)化方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

电白县| 广水市| 梓潼县| 盐池县| 邹城市| 舞钢市| 华蓥市| 延安市| 沙河市| 怀柔区| 观塘区| 金秀| 集安市| 岱山县| 浑源县| 安西县| 宁津县| 宣恩县| 包头市| 福贡县| 桑日县| 勃利县| 额尔古纳市| 忻州市| 新建县| 临颍县| 彝良县| 江华| 精河县| 忻城县| 合江县| 民权县| 南陵县| 胶州市| 界首市| 伊金霍洛旗| 台前县| 台东县| 东山县| 临清市| 濮阳市|