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