生活中有非常多隊列的影子,比方打飯排隊,買火車票排隊問題等,能夠說與時間相關的問題,一般都會涉及到隊列問題;從生活中,能夠抽象出隊列的概念,隊列就是一個能夠實現“先進先出”的存儲結構。隊列分為鏈式隊列和靜態隊列;靜態隊列一般用數組來實現,但此時的隊列必須是循環隊列,否則會造成巨大的內存浪費;鏈式隊列是用鏈表來實現隊列的。這里講的是循環隊列,首先我們必須明確以下幾個問題
一、循環隊列的基礎知識
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; } }