一、概述
棧和隊列是兩種操作受限的線性表。
線性表:線性表是一種線性結構,它是一個含有n≥0個結點的有限序列,同一個線性表中的數據元素數據類型相同并且滿足“一對一”的邏輯關系。“一對一”的邏輯關系指的是對于其中的結點,有且僅有一個開始結點沒有前驅但有一個后繼結點,有且僅有一個終端結點沒有后繼但有一個前驅結點,其它的結點都有且僅有一個前驅和一個后繼結點。
受限表現在:棧的插入和刪除操作只允許在表的尾端進行(在棧中成為“棧頂”),滿足“FIFO:First In Last Out”;隊列只允許在表尾插入數據元素,在表頭刪除數據元素,滿足“First In First Out”。
二、棧與隊列的異同
棧與隊列的相同點:
1.都是線性結構。
2.插入操作都是限定在表尾進行。
3.都可以通過順序結構和鏈式結構實現。
4.插入與刪除的時間復雜度都是O(1),在空間復雜度上兩者也一樣。
5.多鏈棧和多鏈隊列的管理模式可以相同。
棧與隊列的不同點:
1.刪除數據元素的位置不同,棧的刪除操作在表尾進行,隊列的刪除操作在表頭進行。
2.應用場景不同:常見棧的應用場景包括括號問題的求解,表達式的轉換和求值,函數調用和遞歸實現,深度優先搜索遍歷等;常見的隊列的應用場景包括計算機系統中各種資源的管理,消息緩沖器的管理和廣度優先搜索遍歷等。
3.順序棧能夠實現多棧空間共享,而順序隊列不能。
三、兩個棧實現一個隊列,兩個隊列實現一個棧
兩個棧實現一個隊列
思路1:
將stack1作為存儲空間,將stack2作為臨時緩沖區,入隊時,直接壓入stack1,出隊時,將stack1中的元素依次出棧壓入stack2中,再將stack2的棧頂元素彈出,最后將stack2中的元素再倒回給stack1。
思路2:
入隊時,判斷stack1是否為空,如果stack1為空,則將stack2中的所有元素都倒入stack1中,再將元素直接壓入stack1,否則,直接壓入stack1中; 出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,在將stack2的棧頂元素彈出,否則,直接彈出stack2的棧頂元素。
思路3:
入隊時,直接壓入stack1中;出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。
兩個隊列實現一個棧
將queue1用作進棧出棧,queue2作為一個中轉站,入棧時,直接壓入queue1中;出棧時,先將queue1中的元素除最后一個元素外依次出隊列,并壓入隊列queue2中,將留在queue1中的最后一個元素出隊列即為出棧元素,最后還要把queue2中的元素再次壓入queue1中。