一、棧
當某個數據集合只涉及在一端插入和刪除數據,並且滿足後進先出、先進後出的特性,我們就應該首選“棧”這種數據結構。
棧既可以用數組來實現,也可以用鏈表來實現。用數組實現的棧,我們叫作順序棧,用鏈表實現的棧,我們叫作鏈式棧。
1.1 如何實現一個“棧”?
- 在入棧和出棧過程中,只需要一兩個臨時變量存儲空間,所以空間複雜度是 O(1);
- 不管是順序棧還是鏈式棧,入棧、出棧只涉及棧頂個別數據的操作,所以時間複雜度都是 O(1)。
1.2 支持動態擴容的順序棧
- 對於出棧操作來說,我們不會涉及內存的重新申請和數據的搬移,所以出棧的時間複雜度仍然是 O(1)。
- 對於入棧操作來說,當棧中有空閒空間時,入棧操作的時間複雜度爲 O(1);但當空間不夠時,就需要重新申請內存和數據搬移,所以時間複雜度就變成了 O(n)。
- 對於入棧操作來說,最好情況時間複雜度是 O(1),最壞情況時間複雜度是 O(n),平均情況下的時間複雜度可以用攤還分析法爲O(1)。
二、隊列
先進者先出,這就是典型的“隊列”