力扣(用隊列實現棧)

解析 LeetCode 225. 用隊列實現棧:單隊列的巧妙運用

一、題目分析

在這里插入圖片描述

(一)功能需求

實現 MyStack 類,支持棧的四種操作:

  • push(int x):將元素壓入棧頂。
  • pop():移除并返回棧頂元素。
  • top():返回棧頂元素。
  • empty():判斷棧是否為空。
    需用隊列(本題代碼用單隊列 )模擬棧的 LIFO 特性。

(二)核心挑戰

隊列是先進先出(FIFO )結構,而棧是后入先出(LIFO )結構,如何通過隊列操作模擬棧的“棧頂操作”是關鍵。

二、算法思想:單隊列的反轉操作

(一)核心思路

利用單隊列,在每次 push 操作時,通過“將新元素入隊后,把隊列中之前的所有元素依次出隊再入隊”,讓新元素移動到隊列頭部,從而模擬棧的“棧頂”位置。這樣,隊列的頭部始終對應棧的棧頂,后續 poptop 操作可直接操作隊列頭部。

(二)操作邏輯

  • push 操作
    1. 新元素入隊。
    2. 將隊列中除新元素外的所有元素依次出隊并重新入隊。這樣,新元素會被“移到”隊列頭部,成為棧頂。
  • pop 操作:直接彈出隊列頭部元素(對應棧頂 )。
  • top 操作:返回隊列頭部元素(對應棧頂 )。
  • empty 操作:判斷隊列是否為空。

三、代碼實現與詳細解析

class MyStack {// 用于模擬棧的隊列,選擇 LinkedList 實現隊列(支持高效的入隊、出隊)Queue<Integer> queue; public MyStack() {// 初始化隊列queue = new LinkedList<>(); }public void push(int x) {// 新元素入隊queue.offer(x); int size = 0;// 遍歷隊列中除新元素外的所有元素(新元素是最后入隊的,所以循環 size < 隊列長度 - 1 次)while (size < queue.size() - 1) { // 隊首元素出隊,重新入隊到隊尾queue.offer(queue.poll()); size++;}}public int pop() {// 隊列頭部是棧頂,直接彈出return queue.poll(); }public int top() {// 隊列頭部是棧頂,直接返回return queue.peek(); }public boolean empty() {// 判斷隊列是否為空return queue.isEmpty(); }
}

(一)代碼流程拆解

  1. 初始化queueLinkedList 實現(因 LinkedListQueue 接口的常用實現,支持高效的 offerpollpeek 操作 )。
  2. push 操作
    • 新元素 x 入隊(queue.offer(x) )。
    • 循環 size < queue.size() - 1 次(size 初始為 0 ):每次將隊首元素出隊(queue.poll() )并重新入隊(queue.offer(...) )。此操作讓新元素前的所有元素“繞到”隊列尾部,新元素成為隊首,模擬棧頂。
  3. pop 操作:調用 queue.poll() 彈出隊首元素(即棧頂 )。
  4. top 操作:調用 queue.peek() 返回隊首元素(即棧頂 )。
  5. empty 操作:調用 queue.isEmpty() 判斷隊列是否為空,即棧是否為空。

(二)關鍵邏輯解析

  • push 操作的反轉技巧:通過將新元素入隊后,把之前的元素循環“出隊再入隊”,讓新元素移動到隊首。例如,隊列原是 [a, b, c],入隊 d 后變為 [a, b, c, d],循環 3 次(size < 4 - 1 ):
    • 第一次:a 出隊入隊 → [b, c, d, a]
    • 第二次:b 出隊入隊 → [c, d, a, b]
    • 第三次:c 出隊入隊 → [d, a, b, c]
      最終新元素 d 成為隊首,對應棧頂。
  • 單隊列的優勢:相比雙隊列實現(一個隊列存元素,一個隊列輔助 ),單隊列通過反轉操作,減少了隊列數量,代碼更簡潔,利用隊列自身操作完成模擬。
  • 時間復雜度分析push 操作的時間復雜度為 O(n)n 是當前隊列長度,需循環 n - 1 次 );poptopempty 操作的時間復雜度為 O(1)

四、復雜度分析

(一)時間復雜度

  • pushO(n)O(n)O(n)n 是當前棧中元素個數(需移動 n - 1 個元素 )。
  • popO(1)O(1)O(1) ,直接彈出隊首。
  • topO(1)O(1)O(1) ,直接訪問隊首。
  • emptyO(1)O(1)O(1) ,直接判斷隊列是否為空。

(二)空間復雜度

所有操作僅使用一個隊列,空間復雜度為 O(n)O(n)O(n)n 是棧中元素最大數量 )。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94580.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器Docker 安裝和常用命令總結

Docker 安裝和常用命令總結Docker 是一種開源平臺&#xff0c;用于自動化應用程序的部署、擴展和管理。通過將應用程序及其依賴打包到一個輕量級、可移植的容器中&#xff0c;Docker 能夠在任何地方統一運行&#xff0c;解決了不同環境間的兼容性問題。本篇文章將介紹 Docker 的…

2025年廣東省無線電管理普法宣傳活動

一、無線電發射設備型號核準相關制度及要求1.型號核準設備類型&#xff1a;一、公眾網移動通信設備二、專用通信設備三、無線接入設備四、廣播發射設備五、雷達設備六、導航設備七、衛星通信設備(含終端地球站)無線電發射設備八、公眾網移動通信模塊九、無線接入模塊十、其他設…

使用 Whisper 將南蒂羅爾方言語音轉錄為標準德語文本的研究

使用 Whisper 將南蒂羅爾方言語音轉錄為標準德語文本的研究 原文:Speech transcription from South Tyrolean Dialect to Standard German with Whisper 本研究展示了首個經過微調的Whisper模型,用于將南蒂羅爾方言語音自動翻譯為標準德語文本。為了滿足字幕和翻譯方面尚未被…

Nexus管理maven倉庫和jar包的配置和使用

登錄nexus以后點擊Settings-Repository-Repositories-Create repository 選擇maven2(hosted)創建兩個倉庫一個是Release叫做monitor-releases&#xff1a;一個是Snapshot叫做monitor-snapshots&#xff1a;在創建一個maven2(group)叫做monitor將maven-central&#xff08;用于存…

瘋狂星期四文案網第50天運營日記

網站運營第50天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今天流量減了一些&#xff0c;我發現我的瘋狂星期四的詞沒有排名第一了&#xff0c;感覺應該是抽象文案這個導致的&#xff0c;因為我發了…

計算機視覺學習路線:從入門到進階的完整指南

計算機視覺學習路線&#xff1a;從入門到進階的完整指南 計算機視覺&#xff08;Computer Vision, CV&#xff09;是人工智能領域最熱門和最具前景的方向之一&#xff0c;它賦予機器“看”和“理解”圖像與視頻的能力。無論你是學生、工程師還是對AI感興趣的愛好者&#xff0c…

移動應用抓包與調試實戰 Charles工具在iOS和Android中的應用

隨著移動互聯網的發展&#xff0c;幾乎所有應用都依賴API接口進行數據交互。無論是登錄注冊、支付功能&#xff0c;還是新聞資訊加載&#xff0c;背后都需要與服務器頻繁通信。如何快速定位問題、驗證數據傳輸、模擬弱網環境&#xff0c;成為移動端開發者日常工作中的關鍵任務。…

【Python NTLK自然語言處理庫】

安裝流程 import nltk nltk.download()運行后出現一個界面&#xff0c;然后按DownloadTokenize ###分詞 from nltk.tokenize import word_tokenize text "The vendor paid $20,000,000." tokens word_tokenize(text) print(tokens)輸出 [The, vendor, paid, $, 20,…

GitHub 熱榜項目 - 日榜(2025-08-25)

GitHub 熱榜項目 - 日榜(2025-08-25) 生成于&#xff1a;2025-08-25 統計摘要 共發現熱門項目&#xff1a;20 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術趨勢&#xff1a;1&#xff09;AI代理開發成主流&#xff0c;如moeru-ai/airi的虛擬伴…

Mac相冊重復照片終結指南:技術流清理方案

你的Mac相冊是否變成了"重復照片博物館"&#xff1f;同一場景的多個版本、連續拍攝的相似圖片、不同設備導入的重復文件...這些數字冗余正在悄無聲息地吞噬著寶貴的存儲空間。本文將為你提供一套完整的技術解決方案。重復照片問題的技術分析重復類型分類從技術角度&a…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(19):文法復習+單詞第7回1

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;19&#xff09;&#xff1a;文法單詞第7回&#xff11; 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff11;ー 復習3、單詞&#xff08;1&#xff09;日語單詞  …

完美世界招數據倉庫工程師咯

數據倉庫工程師-偏BI方向 &#xff08;崗位信息經過jobleap.cn授權&#xff0c;可在CSDN發布&#xff09;完美世界 北京 職位描述 負責數據倉庫架構設計、建模和ETL開發&#xff0c;構建可擴展的數據倉庫和分析解決方案&#xff1b; 負責對數據倉庫的性能和效率優化&#xff1…

RabbitMQ面試精講 Day 26:RabbitMQ監控體系建設

【RabbitMQ面試精講 Day 26】RabbitMQ監控體系建設 在“RabbitMQ面試精講”系列的第26天&#xff0c;我們將聚焦于RabbitMQ監控體系建設這一關鍵運維主題。作為消息中間件的核心組件&#xff0c;RabbitMQ一旦出現消息積壓、節點宕機或資源耗盡等問題&#xff0c;將直接影響系統…

把word按章節分為n份 一個文檔拆分為多份格式不變

如果你有一個word文檔&#xff0c;里面有很多章節&#xff0c;你想按照章節把它分為N份&#xff0c;每一份存放在一個獨立的文檔中&#xff0c;而且拆分之后的文檔格式和圖片都保持不變。那么你可以試一下這個工具。 #word拆分 #word按章節拆分 #word分為n份 #docx拆分章節 把w…

項目歷程—緩存系統v1

實現目標1&#xff1a;輸入key&#xff0c;value可以存儲新建一個文件&#xff0c;并存儲一個值 (√) 實現目標2&#xff1a;封裝方法&#xff0c;循環創建1000個文件&#xff0c;分別存儲一個值 (√) 實現目標3&#xff1a;通過輸入一個key可以檢測到文件里面的內容值 (√) 兩…

最新刀客IP地址信息查詢系統源碼_含API接口_首發

目錄 一、詳細介紹 二、效果展示 1.部分代碼 2.效果圖展示 三、學習資料下載 一、詳細介紹 最新刀客IP地址信息查詢系統源碼_含API接口_首發_自適應手機端 今天看到的這個接口&#xff0c;所以做了頁面供大家方便使用 查詢的IP信息包含&#xff1a; ASN編號 所屬國家…

電商商品管理效率低?MuseDAM 系統如何破解庫存混亂難題

核心要點 問題&#xff1a;電商企業在商品管理中面臨商品信息分散、素材查找困難、上架周期長、多渠道同步難等核心痛點。 答案&#xff1a;DAM數字資產管理系統通過建立統一的商品素材庫&#xff0c;實現智能分類標簽、自動化工作流程、多渠道同步發布&#xff0c;幫助電商企…

C#/.NET/.NET Core技術前沿周刊 | 第 51 期(2025年8.18-8.24)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

[MH22D3開發筆記]2. SPI,QSPI速度究竟能跑多快,雙屏系統的理想選擇

MH22D3xx系列&#xff0c;是兆訊公司推出的第二代芯片&#xff0c;主頻和第一代MH2103一樣&#xff0c;保持216Mhz的高主頻&#xff0c;RAM 64KB&#xff0c;FLASH可以到512KB。依然和stm32F103保持pin to pin的高度兼容&#xff0c;但是在局部功能和接口上已經是青出于藍而勝于…