隊列的定義:
隊列是隻允許在一端進行插入操作,在另一端進行刪除操作的線性表。允許插入的一端稱爲隊尾,另一端爲隊頭
隊列有兩種存儲方式,先來看隊列的數序存儲結構:
循環隊列定義:頭尾相接的順序存儲結構稱爲循環隊列。那怎麼判斷隊列是空還是滿呢?
方法1:設置一個flag標誌變量,當front==rear且flag==0時隊列爲空,當front==rear且flag=1時隊列爲滿。
方法2:隊列空時,條件是front==rear,隊列滿時,修改其條件保留一個空間元素,我們認爲隊列滿了。
下面主要介紹第二種方法:
若隊列的最大尺寸是QueueSize,那麼隊列滿的條件是(rear+1)%QueueSize == front。隊列的長度計算公式爲(rear-front+QueueSize)%QueueSize。
-
-
typedef struct
-
{
-
int data[MAXSIZE];
-
int front;
-
int rear;
-
}SqQueue;
-
-
int init(SqQueue *Q)
-
{
-
Q->front = 0;
-
Q->rear = 0;
-
return success;
-
}
-
-
int length(SqQueue Q)
-
{
-
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
-
}
-
-
int EnQueue(SqQueue *Q,int e)
-
{
-
if((Q->rear + 1) % MAXSIZE == Q->front)
-
{
-
return error;
-
}
-
Q->data[Q->rear] = e;
-
Q->rear = (Q->rear + 1) % MAXSIZE;
-
return success;
-
}
-
-
int DeQueue(SqQueue *Q,int e)
-
{
-
if(Q->front == Q->rear)
-
{
-
return error;
-
}
-
*e = Q->data[Q->front];
-
Q->front = (Q->front + 1) % MAXSIZE;
-
return success;
-
}
隊列的鏈式存儲結構,其實就是線性表的單鏈表,只不過它只能尾進頭出,我們簡稱之爲鏈隊列。如下圖:
-
<span style="font-size:18px;">
-
typedef struct QNode
-
{
-
int data;
-
struct QNode *next;
-
}QNode,*QueuePtr;
-
-
-
typedef struct
-
{
-
QueuePtr front,rear;
-
}LinkQueue;
-
-
-
int EnQueue(LinkQueue *Q,int e)
-
{
-
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
-
if(!s)
-
{
-
printf("分配失敗\n");
-
}
-
s->data = e;
-
s->next = NULL;
-
Q->next->next = s;
-
Q->rear =s;
-
return success;
-
}
-
-
int DeQueue(LinkQueue *Q,int *e)
-
{
-
QueuePtr p;
-
if(Q->front == Q->rear)
-
{
-
return error;
-
}
-
p = Q->front->next;
-
*e = p->data;
-
Q->front->next = p->next;
-
if(Q->rear == p)
-
{
-
Q->rear = Q->front;
-
}
-
free(p);
-
return success;
-
}</span>