C語言資料結構-順序佇列
阿新 • • 發佈:2018-12-30
順序佇列
順序佇列與順序表相似,只不過其具有佇列的運算規則。資料只能從隊尾進,對頭出,為先進先出方式。
分別用兩個數來表示隊頭front和隊尾rear的位置,其只能向前增加,不能退後,這樣容易溢位且浪費空間,因此一般用迴圈佇列來表示,及佇列空間的首尾相連的,當達到隊尾時可以跳轉到最開始位置。
下面為順序佇列和迴圈佇列的結構圖:
迴圈佇列一般用一個額外的數來表示隊滿或隊空,或者空一個元素,用來測試尾指標加1是否等於頭指標。
下面利用第一種方式實現佇列及其相關運算:
#include <stdio.h>
#define QueueSize 20
//typedef int DataType ;
#define DataType int
typedef struct {
DataType data[QueueSize];
int front;
int rear;
int count;
}Queue;
//初始化佇列
void InitQueue(Queue *Q)
{
Q->front = 0;
Q->rear = 0;
Q->count = 0;
}
//佇列是否為空
int QueueEmpty(Queue *Q)
{
return (Q->count == 0);
}
//佇列是否滿
int QueueFull(Queue *Q)
{
return (Q->count == QueueSize);
}
//入隊
void EnQueue(Queue *Q, DataType v)
{
if(QueueFull(Q))
printf("Error, the queue is full!");
Q->data[Q->rear] = v;
Q->rear = (Q->rear+1)%QueueSize; //迴圈,防止rear大於QueueSize;
Q->count++;
}
//出隊
DataType DeQueue(Queue *Q )
{
DataType i;
if(QueueEmpty(Q))
printf("Error, the queue is empty");
i = Q->data[Q->front];
Q->front = (Q->front+1)%QueueSize; //迴圈
Q->count--;
return i;
}
//讀隊頭元素,不改變對狀態
DataType ReadQueue(Queue *Q)
{
DataType i;
if(QueueEmpty(Q))
printf("Error, the queue is empty");
i = Q->data[Q->front];
return i;
}
int main()
{
Queue Q, *Q1;
int i = 1;
InitQueue(&Q);
while(i<=6)
{
EnQueue(&Q,i);
i++;
}
printf("DeQueue: %d\n", DeQueue(&Q));
printf("DeQueue: %d\n", DeQueue(&Q));
printf("DeQueue: %d\n", ReadQueue(&Q));
EnQueue(&Q,9);
printf("The queue :");
while(!QueueEmpty(&Q))
printf("%d\t",DeQueue(&Q));
Q1 = &Q;
printf("\nThe length of the queue: %d", Q1->count);
return 0;
}
測試結果為:
DeQueue:1
DeQueue:2
DeQueue:3
The queue: 3 4 5 6 9
The length of the queue : 0