先進者後出,後進者先出,LIFO,典型的"棧"結構

從棧的操作特性上來看, 棧是一種"操作受限"的線性表 ,只允許在一段插入和刪除數據。

在功能上來說,數組和鏈表可以代替棧,但特定的數據結構是對特定場景的抽象,

數組或鏈表暴露了太多的操作接口,操作上的確靈活自由,但使用時就比較不可控,也就更容易出錯。

當某個數據集合 只涉及在一端插入和刪除數據,並且滿足後進先出、先進後出的特性,"棧"的存在就凸顯出來了。

棧可以用數組來實現,叫 順序棧

也可以用鏈表來實現,叫 鏈式棧

棧主要有兩個操作: 入棧push()出棧pop()

也就是在棧頂插入一個數據和從棧頂刪除一個數據。

不管是順序棧還是鏈式棧,入棧、出棧只涉及棧頂個別數據的操作。

隊列

先進者先出,FIFO,典型的"隊列"結構。

跟棧一樣也是一種 操作受限的線性表數據結構。

隊列很貼近生活中的排隊,先來先買,後來者排在後面,不允許插隊。

特點 :先進先出,主要的兩個操作:入隊和出隊。

跟棧的操作一般無二,數組實現的叫 順序隊列 ,鏈表的是 鏈式隊列

隊列只支持: 入隊enqueue() ,放一個數據到隊列尾部;

出隊dequeue(),  從隊列頭部取一個數據。

循環隊列、阻塞隊列、併發隊列等具有某些額外特性的隊列,

它們在很多偏底層系統,框架、中間件的開發中,起到了關鍵性作用。

阻塞隊列 ( 有點生成器的味道

就是在隊列基礎上添加了阻塞操作。

在隊列爲空的時候,從對頭取數據會被阻塞。因爲此時還沒有數據可取,直到隊列中有了數據才能返回;

如果隊列滿了,那麼插入數據的操作就會被阻塞,直到有了空閒位置,再插入數據,然後再返回

使用阻塞隊列 可以輕鬆實現一個  "生產者 - 消費者模式"。

可以有效地協調生產和消費速度。當“生產者”生產數據的速度過快,

“消費者”來不及消費時,存儲數據的隊列很快就滿了。這個時候,生產者就阻塞等待,直到“消費者”消費了數據,

“生產者”纔會被喚醒繼續“生產”。

還可以通過協調“生產者”和“消費者”的個數,來提高數據的處理效率。

可以多配置幾個“消費者”,來應對一個“生產者”。

相關文章