隊列:
只允許在一端進行插入操作,另一端進行刪除操作的線性表
循環隊列:
隊列的頭尾相接的順序存儲結構稱爲循環隊列
front指向第一個元素,rear指向最後一個元素的下一個位置
隊空front==rear
隊空和隊滿的時候條件是一樣的,我們有兩種解決辦法,首先是設置一個標識位,用來區別隊空和隊滿的。其次是少用一個單元,即當只有一個單元的時候,我們就認爲隊滿了。我們使用下一種方法,即犧牲一個單元格。
隊滿:因爲有以下兩種情況,rear大於front和rear小於front,所以我們不能簡單的使用rear+1==front來判斷了,必須使用(rear+1)%QueueSize == front
隊長:同上,也是有兩種情況,一種是rear大於front時(rear-front),另一種爲rear小於front,(QueueSize-front+rear),所以通用的公式爲(QueueSize-front+rear)%QueueSize
- #define MAXSIZE 40
- typedef int ElemType;
- typedef struct SqQueue{
- ElemType data[MAXSIZE];
- int front;
- int rear;
- }SqQueue,*pSqQueue
- void initQueue(pSqQueuue pQ){
- Q->front = 0;
- Q->rear = 0;
- }
- int QueueLength(SqQueue Q){
- return (Q.rear+MAXSIZE-Q.front)%MAXSIZE;//求隊長
- }
- bool EnQueue(pSqQueue pQ,ElemType e){
- if((pQ->rear+1)%MAXSIZE)==pQ->front){//判斷隊滿
- return false;
- }
- pQ->data[pQ->rear] = e;
- pQ->rear = (pQ->rear+1)%MAXSIZE;//尾指針移位
- return true;
- }
- bool DeQueue(pSqQueue pQ,ElemType *e){
- if((pQ->rear) == (pQ->front)){//判斷隊空
- return false;
- }
- *e = pQ->data[pQ->front];
- pQ->front = (pQ->front+1)%MAXSIZE;//頭指針移位
- return true;
- }