我在上一篇部落格《C語言實現使用靜態陣列實現迴圈佇列》中實現了使用靜態陣列來模擬佇列的操作。由於陣列的大小已經被指定,無法動態的擴充套件。所以在這篇部落格中,我換成動態陣列來實現。動態陣列可以不斷開闢記憶體空間,只是會在陣列的初始化時有所不同,其他對陣列的操作都是一樣的。程式碼上傳至 https://github.com/chenyufeng1991/Queue_DynamicArray 。
(1)宣告變數
1 2 3 4 |
static int *queue;//宣告陣列 static int maxSize;//陣列大小 static int head;//指向頭部 static int tail;//指向尾部 |
(2)初始化佇列
1 2 3 4 5 6 7 8 |
//初始化佇列 void InitQueue(int size){ maxSize = size; queue = (int *)malloc(size * sizeof(int)); head = 0; tail = 0; } |
(3)進佇列
1 2 3 4 5 6 7 8 9 10 11 |
//進佇列 void EnQueue(int value){ //先判斷是否已滿 if ((tail + 1) % maxSize == head) { printf("佇列已滿,無法插入\n"); }else{ //未滿 queue[tail] = value; tail = (tail + 1) % maxSize; } } |
(4)出佇列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//出佇列 int DeQueue(){ int temp; //先判斷是否為空 if (head == tail) { printf("佇列為空,出列失敗\n"); }else{ temp = head; head = (head + 1) % maxSize; } return temp; } |
(5)判斷佇列是否為空
1 2 3 4 5 6 7 8 9 10 |
//判斷佇列是否為空 int IsEmpty(){ if (head == tail) { printf("佇列為空\n"); return 1; } printf("佇列不為空\n"); return 0; } |
(6)判斷佇列是否已滿
1 2 3 4 5 6 7 8 9 10 11 |
//判斷佇列是否已滿 int IsFull(){ if ((tail + 1)% maxSize == head) { printf("佇列已滿\n"); return 1; } printf("佇列未滿\n"); return 0; } |
(7)列印佇列元素
1 2 3 4 5 6 7 |
//列印佇列元素 void PrintQueue(){ for (int i = head; i < tail; i++) { printf("%d ",queue[i]); } printf("\n"); } |
(8)測試程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int main(int argc, const char * argv[]) { InitQueue(5); EnQueue(2);EnQueue(4);EnQueue(8);EnQueue(1);EnQueue(5); PrintQueue(); DeQueue();DeQueue();DeQueue(); PrintQueue(); IsEmpty(); IsFull(); return 0; } |