1. 程式人生 > >C語言資料結構-順序佇列

C語言資料結構-順序佇列

順序佇列

順序佇列與順序表相似,只不過其具有佇列的運算規則。資料只能從隊尾進,對頭出,為先進先出方式。
分別用兩個數來表示隊頭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