學習軌道
/
Pharo
Pharo
/
練習
/
環狀緩衝區
環狀緩衝區

環狀緩衝區

中等

說明

環狀緩衝區、循環緩衝區或環形緩衝區是一種資料結構,它使用單一固定大小的緩衝區,就好像頭尾相連一樣。

環狀緩衝區一開始是空的,並有某個預先定義好的長度。 例如,這是一個有 7 個元素的緩衝區:

[ ][ ][ ][ ][ ][ ][ ]

假設把 1 寫入緩衝區的中間(在環狀緩衝區裡,實際的起始位置並不重要):

[ ][ ][ ][1][ ][ ][ ]

接著假設再加入兩個元素,也就是 2 和 3,它們會被附加在 1 之後:

[ ][ ][ ][1][2][3][ ]

如果接著從緩衝區移除兩個元素,被移除的會是緩衝區裡最舊的值。 在這個例子裡,被移除的兩個元素是 1 和 2,緩衝區裡只剩下一個 3:

[ ][ ][ ][ ][ ][3][ ]

如果緩衝區裡有 7 個元素,那它就完全滿了:

[5][6][7][8][9][3][4]

當緩衝區滿了,就會引發錯誤,提醒用戶端在有空位之前,後續的寫入都會被阻擋。

當緩衝區滿了,用戶端可以選擇用強制寫入來覆寫最舊的資料。 在這個例子裡,會再加入兩個元素,也就是 A 和 B,它們會覆寫掉 3 和 4:

[5][6][7][8][9][A][B]

3 和 4 已被 A 和 B 取代,於是 5 現在成了緩衝區裡最舊的資料。 最後,如果移除兩個元素,回傳的會是 5 和 6,於是緩衝區變成:

[ ][ ][7][8][9][A][B]

因為還有可用的空間,如果用戶端再次使用覆寫來存放 C 和 D,那麼會使用先前存放 5 和 6 的空間,而不是 7 和 8 的位置。 7 仍然是最舊的元素,而緩衝區又再度滿了。

[C][D][7][8][9][A][B]

實作

若要了解操作過程中發生的錯誤情況,請參閱 Error 類別階層(類別端),了解如何以指定的訊息拋出例外。


出處

Wikipedia連結會在新視窗或分頁中開啟
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Pharo Exercism

準備好開始 環狀緩衝區 了嗎?

註冊 Exercism,透過 50 個練習 和真人引導來學習並精通 Pharo,全部免費。

深入探索 環狀緩衝區!

這部影片中,我們來看看環狀緩衝區是什麼、用在哪裡,以及各種不同的實作方式,包括佇列、靜態與動態陣列、不可變資料結構,以及一個有趣的代理程式實作。