詳解數據構造C說話完成之輪回隊列。本站提示廣大學習愛好者:(詳解數據構造C說話完成之輪回隊列)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解數據構造C說話完成之輪回隊列正文
本文講的是輪回隊列,起首我們必需明確上面幾個成績
輪回隊列的基本常識
1.輪回隊列須要幾個參數來肯定
輪回隊列須要2個參數,front和rear
2.輪回隊列各個參數的寄義
(1)隊列初始化時,front和rear值都為零;
(2)當隊列不為空時,front指向隊列的第一個元素,rear指向隊列最初一個元素的下一個地位;
(3)當隊列為空時,front與rear的值相等,但紛歧定為零;
3.輪回隊列入隊的偽算法
(1)把值存在rear地點的地位;
(2)rear=(rear+1)%maxsize
,個中maxsize代表數組的長度;
法式代碼:
bool Enqueue(PQUEUE Q, int val) { if(FullQueue(Q)) return false; else { Q->pBase[Q->rear]=val; Q->rear=(Q->rear+1)%Q->maxsize; return true; } }
4.輪回隊列出隊的偽算法
(1)先保留出隊的值;
(2)front=(front+1)%maxsize
,個中maxsize代表數組的長度;
法式代碼:
bool Dequeue(PQUEUE Q, int *val) { if(EmptyQueue(Q)) { return false; } else { *val=Q->pBase[Q->front]; Q->front=(Q->front+1)%Q->maxsize; return true; } }
5.若何斷定輪回隊列能否為空
if(front==rear)
隊列空;
else
隊列不空;
bool EmptyQueue(PQUEUE Q) { if(Q->front==Q->rear) //斷定能否為空 return true; else return false; }
6.若何斷定輪回隊列能否為滿
這個成績比擬龐雜,假定數組的存數空間為7,此時曾經寄存1,a,5,7,22,90六個元素了,假如在往數組中添加一個元素,則rear=front;
此時,隊列滿與隊列空的斷定前提front=rear
雷同,如許的話我們就不克不及斷定隊列究竟是空照樣滿了;
處理這個成績有兩個方法:
一是增長一個參數,用來記載數組中以後元素的個數;
第二個方法是,罕用一個存儲空間,也就是數組的最初一個存數空間不消,當(rear+1)%maxsiz=front
時,隊列滿;
bool FullQueue(PQUEUE Q) { if(Q->front==(Q->rear+1)%Q->maxsize) //斷定輪回鏈表能否滿,留一個預留空間不消 return true; else return false; }
附錄:
queue.h文件代碼:
#ifndef __QUEUE_H_ #define __QUEUE_H_ typedef struct queue { int *pBase; int front; //指向隊列第一個元素 int rear; //指向隊列最初一個元素的下一個元素 int maxsize; //輪回隊列的最年夜存儲空間 }QUEUE,*PQUEUE; void CreateQueue(PQUEUE Q,int maxsize); void TraverseQueue(PQUEUE Q); bool FullQueue(PQUEUE Q); bool EmptyQueue(PQUEUE Q); bool Enqueue(PQUEUE Q, int val); bool Dequeue(PQUEUE Q, int *val); #endif
queue.c文件代碼:
#include<stdio.h> #include<stdlib.h> #include"malloc.h" #include"queue.h" /*********************************************** Function: Create a empty stack; ************************************************/ void CreateQueue(PQUEUE Q,int maxsize) { Q->pBase=(int *)malloc(sizeof(int)*maxsize); if(NULL==Q->pBase) { printf("Memory allocation failure"); exit(-1); //加入法式 } Q->front=0; //初始化參數 Q->rear=0; Q->maxsize=maxsize; } /*********************************************** Function: Print the stack element; ************************************************/ void TraverseQueue(PQUEUE Q) { int i=Q->front; printf("隊中的元素是:\n"); while(i%Q->maxsize!=Q->rear) { printf("%d ",Q->pBase[i]); i++; } printf("\n"); } bool FullQueue(PQUEUE Q) { if(Q->front==(Q->rear+1)%Q->maxsize) //斷定輪回鏈表能否滿,留一個預留空間不消 return true; else return false; } bool EmptyQueue(PQUEUE Q) { if(Q->front==Q->rear) //斷定能否為空 return true; else return false; } bool Enqueue(PQUEUE Q, int val) { if(FullQueue(Q)) return false; else { Q->pBase[Q->rear]=val; Q->rear=(Q->rear+1)%Q->maxsize; return true; } } bool Dequeue(PQUEUE Q, int *val) { if(EmptyQueue(Q)) { return false; } else { *val=Q->pBase[Q->front]; Q->front=(Q->front+1)%Q->maxsize; return true; } }
以上就是C說話完成輪回隊列的全體內容,關於進修數據構造與算法的研討有所贊助,有須要的同伙可以參考下。