5. 環形隊列

比較例 12.3 “用深度優先搜索解迷宮問題”的棧操作和例 12.4 “用廣度優先搜索解迷宮問題”的隊列操作可以發現,棧操作的top指針在Push時增大而在Pop時減小,棧空間是可以重複利用的,而隊列的headtail指針都在一直增大,雖然前面的元素已經出隊了,但它所占的存儲空間卻不能重複利用。在例 12.4 “用廣度優先搜索解迷宮問題”的解法中,出隊的元素仍然有用,保存着走過的路徑和每個點的前趨,但大多數程序並不是這樣使用隊列的,一般情況下出隊的元素就不再有保存價值了,這些元素的存儲空間應該回收利用,由此想到把隊列改造成環形隊列(Circular Queue):把queue數組想像成一個圈,headtail指針仍然是一直增大的,當指到數組末尾時就自動回到數組開頭,就像兩個人圍着操場賽跑,沿著它們跑的方向看,從headtail之間是隊列的有效元素,從tailhead之間是空的存儲位置,如果head追上tail就表示隊列空了,如果tail追上head就表示隊列的存儲空間滿了。如下圖所示:

圖 12.5. 環形隊列

環形隊列

習題

1、現在把迷宮問題的要求改一下,只要求程序給出最後結論就可以了,回答“有路能到達終點”或者“沒有路能到達終點”,而不需要把路徑打印出來。請把例 12.4 “用廣度優先搜索解迷宮問題”改用環形隊列實現,然後試驗一下解決這個問題至少需要分配多少個元素的隊列空間。