国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

算法與數據結構【四】——C語言實現循環隊列

2019-11-08 01:39:53
字體:
來源:轉載
供稿:網友

隊列是另一種經典數據結構,也是有兩種,一是靜態隊列,即數組實現的循環隊列,二是用鏈表實現的動態隊列,今天我寫的是循環隊列,下面我就詳細分析一下循環隊列我認為不太好理解的幾個點

第零,循環隊列的構成,用一個結構體表示的話是這樣的:

typedef struct queue{    int *pBase;//內部實現隊列的數組,用于儲存元素    int front;//指向隊列第一個元素      int rear;//指向隊列最后一個元素的下一個元素      int maxsize;//循環隊列的最大存儲空間  }QUEUE,*PQUEUE; 這里借鑒了一下這篇文章數據結構:循環隊列(C語言實現)的實現方法。

第一,驗滿 / 驗空,這個是循環隊列的第一個難點,因為乍一想,循環隊列是滿或是空好像都是需要滿足這個條件即可——front == rear,這樣我們就難以分辨隊列到底是滿還是空,其實再仔細一想,辦法還是有的,而且經典的辦法都不止一種,一是立一個flag,當滿或空時這個標志位的值有所不同,這樣就分出了到底是空隊列還是滿隊列。第二種辦法是改變一下這個滿的定義,我們讓隊列的最后一位元素空出來,所以,此時滿的條件就改為了(rear+1)%maxsize == front。為空的條件依然是front == rear。

第二,入隊 / 出隊,因為隊列是先進先出的,所以要入隊只能從隊尾進入,而出隊只能從隊首出去,所以,理解了這一點就很容易能寫出具體的代碼。

第三,隊列的長度計算,當rear>front的時候,此時隊列的長度為rear - front,但是當rear<front時,隊列長度分為兩段,一段是maxsize-front,另一段是rear+0,把兩段相加,就得到了長度為rear-front+maxsize,這樣可以得到一個通用的隊列計算長度公式:

(rear—front + maxsize) % maxsize  這也可以解釋為什么要對maxsize取模,就是為了整合起來隊列長度的計算問題。

不多說,下面上代碼,代碼的命名部分參考了數據結構:循環隊列(C語言實現)這篇博文

#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct queue{	int *pBase;      int front;//指向隊列第一個元素      int rear;//指向隊列最后一個元素的下一個元素      int maxsize;//循環隊列的最大存儲空間  }QUEUE,*PQUEUE;void CreateQueue(PQUEUE Q,int maxsize);void TraverseQueue(PQUEUE Q);int FullQueue(PQUEUE Q);int EmptyQueue(PQUEUE Q);int Enqueue(PQUEUE Q, int val);int Dequeue(PQUEUE Q, int *val);int main(void){	PQUEUE Q = (PQUEUE)malloc(sizeof(QUEUE));	CreateQueue(Q,6);	Enqueue(Q,25);	Enqueue(Q,22);	Enqueue(Q,22);	Enqueue(Q,22);	Enqueue(Q,23);	TraverseQueue(Q);	return 0;}//創建一個空的循環隊列 void CreateQueue(PQUEUE Q,int maxsize){	Q->pBase = (int*)malloc(sizeof(maxsize));	if(Q->pBase == NULL)	{		PRintf("ERROR!");		exit(-1);	}	else	{		Q->maxsize = maxsize;		Q->front = 0;		Q->rear = 0;	}}//遍歷打印隊列 void TraverseQueue(PQUEUE Q){	int i;	printf("隊列中的全部元素為:/n");	for(i=Q->front;i%Q->maxsize<Q->rear;i=(i+1)%Q->maxsize)	{		printf("%d/n",Q->pBase[i]);	}}//判斷隊列是否已滿 int FullQueue(PQUEUE Q){	if(Q->front==(Q->rear+1)%Q->maxsize)//判斷循環鏈表是否滿,留一個預留空間不用          return 1;    else        return 0;}//判斷隊列是否為空 int EmptyQueue(PQUEUE Q){	if(Q->front==Q->rear)//判斷是否為空          return 1;    else        return 0;}//元素入隊 int Enqueue(PQUEUE Q, int val){	if(FullQueue(Q) == 1)        return 0;    else    {        Q->pBase[Q->rear]=val;        Q->rear=(Q->rear+1)%Q->maxsize;        return 1;    }}//出隊 int Dequeue(PQUEUE Q, int *val){	if(FullQueue(Q) == 1)        return 0;    else    {    	*val=Q->pBase[Q->front];     	Q->front=(Q->front+1)%Q->maxsize;    	return *val;    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 卓尼县| 罗甸县| 安吉县| 静乐县| 新密市| 唐山市| 大同市| 孝昌县| 临城县| 扎赉特旗| 开阳县| 五台县| 平潭县| 金湖县| 甘南县| 峨边| 武功县| 肇庆市| 珲春市| 鄂托克旗| 吉林市| 从江县| 饶阳县| 招远市| 鄢陵县| 华安县| 瓮安县| 澄迈县| 高要市| 吴川市| 乐平市| 新沂市| 家居| 华宁县| 汕尾市| 河北省| 常山县| 铅山县| 长葛市| 张掖市| 甘谷县|