標籤:
隊列特性:先進先出(FIFO)——先進隊列的元素先出隊列。來源於我們生活中的隊列(先排隊的先辦完事)。
隊列有下面幾個操作:
- InitQueue() ——初始化隊列
- EnQueue() ——進隊列
- DeQueue() ——出隊列
- IsQueueEmpty()——判斷隊列是否為空白
- IsQueueFull() ——判斷隊列是否已滿
隊列可以由數組和鏈表兩種形式實現隊列操作(c語言),下面僅以數組為例:
數組實現:
隊列資料結構
typedef struct queue{ int queuesize; //數組的大小 int head, tail; //隊列的頭和尾下標 int *q; //數組頭指標}Queue;
InitQueue() ——初始化隊列
void InitQueue(Queue *q){ q->queuesize = 8; q->q = (int *)malloc(sizeof(int) * q->queuesize); //分配記憶體 q->tail = 0; q->head = 0;}
這樣有個缺陷,空間利用率不高。採用迴圈隊列:
EnQueue() ——進隊列
void EnQueue(Queue *q, int key){ int tail = (q->tail+1) % q->queuesize; //取餘保證,當quil=queuesize-1時,再轉回0 if (tail == q->head) //此時隊列沒有空間 { printf("the queue has been filled full!"); } else { q->q[q->tail] = key; q->tail = tail; }}
DeQueue() ——出隊列
int DeQueue(Queue *q){ int tmp; if(q->tail == q->head) //判斷隊列不為空白 { printf("the queue is NULL\n"); } else { tmp = q->q[q->head]; q->head = (q->head+1) % q->queuesize; } return tmp;}
IsQueueEmpty()——判斷隊列是否為空白
int IsQueueEmpty(Queue *q){ if(q->head == q->tail) { return 1; } else { return 0; }}
IsQueueFull()——判斷隊列是否已滿
int IsQueueFull(Queue *q){ if((q->tail+1)% q->queuesize == q->head) { return 1; } else { return 0; }}
隊列(轉載)