佇列,顧名思義就是很多個資料在排隊。既然是排隊,那就不能從最前面或者中間插進去,新來的資料只能排在隊伍的最後。另外,我們另外規定只有隊伍最前面的資料才能出去。當然,其實也只有隊伍最前面的資料能被外界檢視。能滿足這種功能的資料結構稱之為佇列。
我們可以用陣列、鍊錶實現佇列。這裡用陣列實現簡單佇列。
申請10個位置的陣列,用陣列實現簡單佇列
int queue[10]
;int capacity =10;
//佇列的總容量為10
//佇列的範圍是head ~ tail
int head =0;
//佇列的頭的index為0
int tail =0;
//佇列的尾的index為0
我們需要實現幾個方法:
0、依次顯示所有資料 (當作陣列看待,其實佇列不需要這個功能)
void
show()
printf
("\r\n");
}1、讀取佇列的首元素,(不出列)
void
peek()
printf
("佇列的首元素: %d \r\n"
, queue[head]);
//陣列方式訪問資料
}2、入列:在佇列最後面插入乙個數
void
enqueue
(int n)
//tail的位置是空的,所以直接對queue[tail]賦值就是在佇列最後插入資料
queue[tail]
= n;
tail++
;//入列之後tail + 1,保持tail的位置是空的
}3、出列:佇列首元素離開佇列
intdequeue()
int num = queue[head]
;//記錄佇列的首元素
head++
;//出列: 佇列的head不再包含原先的首元素,即刪除了佇列首元素
return num;
//返回資料
}4、計算佇列現有多少個元素
intgetsize()
實現了這些功能之後,簡單佇列的功能就實現了。下面是完整的**:
#include
#include
//申請了10個位置的陣列,用陣列實現簡單佇列
int queue[10]
;int capacity =10;
//佇列的總容量為10
//佇列的範圍是head ~ tail
int head =0;
//佇列的頭的index為0
int tail =0;
//佇列的尾的index為0
//0、依次顯示所有資料 (當作陣列看待,其實佇列不需要這個功能)
void
show()
printf
("\r\n");
}//1、讀取佇列的首元素,(不出列)
void
peek()
printf
("佇列的首元素: %d \r\n"
, queue[head]);
//陣列方式訪問資料
}//2、入列:在佇列最後面插入乙個數
void
enqueue
(int n)
//tail的位置是空的,所以直接對queue[tail]賦值就是在佇列最後插入資料
queue[tail]
= n;
tail++
;//入列之後tail + 1,保持tail的位置是空的
}//3、出列:佇列首元素離開佇列
intdequeue()
int num = queue[head]
;//記錄佇列的首元素
head++
;//出列: 佇列的head不再包含原先的首元素,即刪除了佇列首元素
return num;
//返回資料
}//4、計算佇列現有多少個元素
intgetsize()
intmain()
printf
("顯示所有資料:");
show()
;//依次顯示所有資料
printf
("出列: %d\r\n"
,dequeue()
);printf
("出列: %d\r\n"
,dequeue()
);peek()
;//檢視當前首元素
enqueue(6
);//入列
printf
("入列6, 顯示所有資料:");
show()
;printf
("一共有幾個元素: %d\r\n"
,getsize()
);printf
("顯示所有資料: ");
show()
;//依次顯示所有資料
return0;
}
執行結果:
1、新增10個資料之後,佇列就滿了。後面5個資料就無法新增進去了。(正確)
2、出列了2個元素,剩餘8個元素,首元素為3 。(正確)
3、希望入列乙個元素6。結果顯示佇列滿了,無法新增資料。但實際上這個佇列的容量是10,現有8個元素,容量沒有滿。這是為什麼呢?
原因是我們在新增資料的時候,tail只會不停地往後移動 (++),如果tail == 10,tail就再也不能往後移動了。軟體就認為是佇列滿了。但其實佇列沒有滿,佇列最前面兩個位置已經空出來了,我們可以把資料放在陣列的最前面。這部分內容屬於「迴圈佇列」,請讀者自行實現吧。
最後說明一下,用陣列實現的佇列,入列、出列的時間複雜度都是o(1)。用陣列實現佇列最大的問題是如何保證空間夠用。如果申請很大的陣列,那就會浪費空間。
佇列 鍊錶 C語言實現
佇列 queue 的基本概念 佇列的影象模擬 佇列的基本操作 初始化佇列,判空,入隊,出隊,讀隊頭元素,清空佇列 順序儲存存在的問題 如果用順序儲存結構,假設陣列最大值為maxsize,我們怎麼判斷隊空呢。我們可以利用用隊尾 rear 和隊頭 front 的相對位置來進行判斷,如果rear fron...
C語言實現棧和佇列
標頭檔案 stack.h pragma once include include include typedef int stdatatype typedef struct stack stack 初始化棧 void stackinit stack pst 入棧 void stackpush sta...
C語言實現,順序佇列,迴圈佇列,和棧!
佇列是一種特殊的 線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元...