棧(Stack)和隊列(Queue)

一、概述

棧和隊列是兩種操作受限的線性表。
線性表:線性表是一種線性結構,它是一個含有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中。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 題目一:使用兩個棧實現一個隊列 隊列的聲明如下,請實現它的兩個函數appendTail和deletedHead,分...
    Cehae閱讀 268評論 0 2
  • 棧是限定僅在表尾進行插入和刪除操作的線性表。表尾端稱為棧頂,表頭端稱為棧底。不含元素的空表稱為空棧。棧是后進先出的...
    yinxmm閱讀 1,835評論 0 0
  • 棧 棧的英文單詞是Stack,它代表一種特殊的線性表,這種線性表只能在固定一端(通常認為是線性表的尾端)進行插入,...
    Jack921閱讀 1,521評論 0 5
  • 題目描述:用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。 分析:一個隊列包含...
    levinhax閱讀 7,949評論 0 4
  • 第五周:你不知道你不知道 先曬一下我和12歲女兒對話的片段: 女兒和我談論服裝鞋帽、品牌之類,我要么裝沒聽說過這個...
    般雅閱讀 351評論 0 1