1. 程式人生 > >數據結構與算法之美——棧

數據結構與算法之美——棧

數據結構 空間復雜度 空間 靈活 但是 時間 不能 並且 容易

如何理解棧?

我們平時放盤子的時候,都是從下往上一個一個放,取的時候是從上往下一個一個取,不能從中間抽出。後進者先出,這就是典型的“棧”結構。從棧的操作特性上來看,棧是一種“操作受限”的線性表,只允許從一端插入和刪除。

事實上,從功能上看,數組或鏈表確實可以替代棧,並且操作上更加靈活,但是,在使用時就比較不可控,更容易出錯。

當一個數據集合只涉及在一端的插入和刪除操作,並且滿足後進先出的特性,應該首選“棧”這種數據結構。

實現一個棧

棧主要包含兩個操作:出棧和入棧。棧既可以用數組來實現(順序棧),也可以用鏈表來實現(鏈式棧)。不管是順序棧還是鏈式棧,入棧和出棧的過程中,空間復雜度都是O(1),時間復雜度都是O(1)。

支持動態擴容的順序棧

當數組的空間不夠時,我們就重新申請一塊更大的內存,將原來數組中的數據拷貝進去,這樣就實現了一個支持動態擴容的數組,所以,如果要實現一個支持動態擴容的順序棧,我們只需要在底層依賴一個支持動態擴容的數組就可以。對於出棧,我們不會設計內存的重新申請和數據搬移,出棧的時間復雜度仍然是O(1),但是對於入棧操作來說,當空間不夠時,就需要重新申請內訓空間和進行數據搬移,所以時間復雜度就變成了O(n)。

數據結構與算法之美——棧