佇列是一種先進先出的思想。(first in first out)
我們身邊的與佇列相關例項很多,火車站排隊買票或是買飯是排隊,都是佇列。因此我們很容易想到,佇列是有乙個頭乙個尾的,新來的總是在尾,最先來的總是最先買票或是吃飯,當然,像插隊一類的我們不做考慮,相信我們都不會喜歡這些的。
佇列的成員的進出我們已經知道了,總是隊頭出、隊尾進,**我們身邊的例項,我們可以看到,排隊時,賣飯的阿姨或是賣票的售票員都是不會移動的,移動的都是成員,那麼在**中,我們也需要這樣做嗎?每出隊一位就讓剩下的全體成員集體前移一位,未免太累了。因此我們可以很自然的想到,讓賣飯阿姨或是售票員來移動,成員們保持不動,已經買到飯或是買到票的成員就直接離開。可是我們又有乙個疑問,在空間有限的情況下(即佇列長度有限),當賣飯阿姨移動到隊尾給最後乙個成員打完飯,佇列是不是就沒有位置了呢?聯絡實際我們可以很自然的想到,前面的成員離開了,那麼前面的位置就空出來了啊,再有成員進入佇列就可以去前面的位置啊,只需要讓阿姨在回到最前面重新打飯就可以了啊。這就是佇列的思想。
將上述思想化為**就簡單多了。
首先,在有五個位置的佇列中,當沒有成員進入佇列時,隊頭和隊尾顯然都在第乙個位置。
然後,當有成員進入佇列時,阿姨還沒有開始打飯,隊頭顯然還是在第乙個位置,而第乙個進入佇列後,下乙個成員進入佇列應該到哪個位置呢?顯然是第二個位置,因此,當佇列有乙個成員時,隊尾在第乙個成員的後面,也就是說,隊尾總是在最後乙個成員的後面。
接著,很快佇列就滿了,五個位置都有了成員,顯然不能有成員再進佇列了,這時阿姨開始打飯,給第乙個成員打完飯,阿姨就走向第二個成員,也就是說,當第乙個成員出去後,隊頭就到了第二個成員,因此,隊頭總是在佇列的第乙個成員。
當阿姨給三個人打完飯後,只有第四第五個位置有人了,又有新的成員想進隊打飯,這時他們就會自然而然地走向前面的位置,因為他們知道阿姨打完飯後就會回到第乙個位置給他們打飯,這是隊尾依然是最後乙個進隊的成員的後面,只不過這個成員的位置編號在隊頭前面。
同理,阿姨在給第五個位置的成員打完飯就會回到第乙個位置給同學打飯。
佇列的思想就是這些了,在用陣列實現時,有以下幾個地方需要注意:
1、佇列的長度就是陣列的長度
2、沒有成員時,隊頭隊尾都指向第乙個位置,即下標為0
3、隊頭始終指向佇列中最先進隊的成員,隊尾始終指向佇列中最後進隊的成員的後面下乙個位置
3、當隊頭與隊尾的下標相同時,隊列為空,因此隊尾在指向第四個位置即下標為3時,就應該算隊滿,否則當隊頭下標為0時,最後乙個位置即第五個位置也有成員,此時隊尾下標為0,按照上面的思想應該算隊列為空,與實際不符。因此佇列的實際容量始終為陣列容量減一。
4、按照上面的思想,隊頭和隊尾下標表示應該為(當前下標+1)%陣列容量,在第一圈為0,1,2,3,4,第二圈時繼續自加明顯不合適,因為下標因該為0,因此在自加後對陣列容量取餘
**如下:
#includeusing namespace std;
#define maxsize 10
class queue
;queue::queue()
bool queue::isempty()
bool queue::isfull()
bool queue::enqueue(int data)
bool queue::dequeue(int& data)
int main()
while(q.dequeue(i))
cout
}
佇列(陣列實現)
在現實中,我們去銀行辦理業務的時候就需要排隊。你來的早,排在前面,就會越早的離開。而在你排的隊就是乙個佇列。佇列是個有序列表,它遵循先進先出的原則。根據佇列的先進先出的原則,我們就可以用 來實現乙個佇列。首先在乙個arrayqueue類中建立乙個陣列來代表乙個佇列 private int array...
陣列實現佇列
先進先出。insert入佇列,remove出佇列。陣列實現有佇列空,佇列滿。陣列實現佇列 陣列實現簡單佇列有頭和尾 指標 插入元素,隊尾rear指標上移加1。移除元素,隊頭指標上移加1。環繞處理 迴圈佇列 為了避免佇列不滿卻不能插入資料項的情況,可以讓隊頭隊尾指標繞回到陣列開始的位置,這就是迴圈佇列...
陣列實現佇列
咱不囉嗦佇列的特性先進先出,直接上 package com.dfsn.cloud.eureka public class queue arr new object initsize public void add t obj arr pushindex obj pushindex pushindex...