# Queue 佇列
[TOC]
## 介紹
**Queue**是一個「First-In-First-Out」的資料結構,==**比較早放入Queue的資料會比較早拿出來**==,==**而比較晚放進去的資料會比較晚拿出來**==。跟排隊買票一樣,先排隊的人可以先買到,而後來到的人需要等前面的人買完才能輪到他。
## 程式碼
在Queue的程式碼中,==會需要兩個pointer來分別記錄Queue中的第一個以及最後一個的位址==。
```C=
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node* next;
};
typedef struct node Queue_Node;
Queue_Node *front , *rear ;
front = rear = NULL;
int isEmpty(){ /*判斷Queue是否為空*/
if (front==NULL){ /*當front是NULL時,代表Queue裡已沒有資料,回傳1*/
return 1;
}
else{ /*反之,代表Queue裡還有資料,回傳0*/
return 0;
}
}
void enqueue(int data){ /*增加資料至Queue中*/
Queue_Node* newnode=(Queue_Node*)malloc(sizeof(Queue_Node));/*建立新的node*/
newnode->data = data;
newnode->next = NULL;
if (front == NULL){ /*如果front為NULL,代表Queue裡尚未有資料*/
front = newnode; /*將front和rear指向newnode*/
rear = newnode;
return;
}
rear->next = newnode; /*將rear的pointer指向newnode*/
rear = newnode; /*將rear指向newnode*/
}
int dequeue(int* ret){ /*從Queue中拿出資料*/
int data;
Queue_Node* tmp;
if (isEmpty()){ /*判斷Queue是否為空*/
printf("Queue is empty!\n");
return -1; /*如果為空,回傳值-1*/
}
else{ /*如果Queue裡還有資料*/
data=front->data;
tmp=front;
front = front->next;/*將front指向下一筆資料*/
free(tmp); /*釋放記憶體*/
*ret=data; /*將資料傳給*ret*/
return 0; /*回傳值0*/
}
}
int main(){
int value;
int i, a;
printf("輸入五筆資料:\n");
for (i=0;i<5;i++){
scanf("%d",&value);
enqueue(value);
}
printf("============\n");
while(1){
if (dequeue(&a)!=0){ /*判斷dequeue()的回傳值是否為0*/
printf("dequeue error!\n");
return -1;
}
printf("dequeue:%d\n",a);
}
printf("hi");
return 0;
}
```
## 程式解說
在 enqueue( ) 函數中,如果 Queue 是空的時候,執行24~26行,令新的節點 newnode 來當作第一筆資料,並將front 和 rear 指向 newnode。如果已有資料在 Queue 裡的時候,則是執行28~29行,此時 rear 應該會指向其中的最後一個node,因此我們需要將 rear 的 pointer 指向 newnode,再將 rear 指向 newnode (新的最後一個節點)。
在 dequeue( ) 函數中,如果 Queue 是空的,便會回傳值-1,因此在主程式58行做判斷時,因為不為0,因此輸出"dequeue error!",並且結束程式,所以執行程式時,就不會輸出第64行的"hi"。如果 Queue 裡面還有資料,則會回傳值0,並將資料傳給 *ret ,因此不會進入主程式58行的 if 迴圈,而是直接到62行輸出資料。