左神算法之單輔助棧排序算法

目錄

  • 1. 題目
  • 2. 解釋
  • 3. 思路
  • 4. 代碼
  • 5. 總結

1. 題目

請編寫一個程序,對一個棧里的整型數據,按升序進行排序(即排序前棧里的數據是無序的,排序后最大元素位于棧頂)。要求最多只能使用一個額外的棧存放臨時數據,且不得將元素復制到別的數據結構中。

2. 解釋

  • 輸入:一個無序的整數棧
  • 輸出:一個升序排列的棧(棧頂為最大元素)
  • 限制條件
    1. 只能使用一個額外的棧作為輔助空間
    2. 不能使用其他數據結構(如數組、隊列等)
    3. 只能使用棧的標準操作(push, pop, peek, isEmpty

3. 思路

核心算法:使用類似插入排序的思想,借助輔助棧實現排序

  1. 初始化一個輔助棧 sortedStack(最終存放排序結果)
  2. 當原棧不為空時:
    • 彈出原棧的棧頂元素 temp
    • 如果 sortedStack 不為空且 tempsortedStack 的棧頂元素大,則將 sortedStack 的元素彈出并壓回原棧,直到找到 temp 的正確位置 ,否則將元素temp放入到 sortedStack
    • temp 壓入 sortedStack
  3. 最終 sortedStack 即為升序排列的棧

時間復雜度:O(n2)(最壞情況下需要反復移動元素)
空間復雜度:O(n)(僅使用一個額外棧)

4. 代碼

import java.util.Stack;public class StackSorter {public static Stack<Integer> sortStack(Stack<Integer> inputStack) {Stack<Integer> sortedStack = new Stack<>();while (!inputStack.isEmpty()) {int temp = inputStack.pop();// 將 sortedStack 中比 temp 大的元素移回 inputStackwhile (!sortedStack.isEmpty() && sortedStack.peek() > temp) {inputStack.push(sortedStack.pop());}sortedStack.push(temp);}return sortedStack;}public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(5);stack.push(1);stack.push(4);stack.push(2);stack.push(3);System.out.println("排序前: " + stack);Stack<Integer> sortedStack = sortStack(stack);System.out.println("排序后: " + sortedStack);}
}

輸出示例

排序前: [5, 1, 4, 2, 3]
排序后: [1, 2, 3, 4, 5]  // 棧頂為5(最大元素)

5. 總結

  • 關鍵點:利用輔助棧實現類似插入排序的算法,通過比較和臨時回退操作確保正確排序。
  • 限制滿足:僅使用一個額外棧,沒有借助其他數據結構。
  • 適用場景:適用于棧排序的經典問題,如面試題或算法練習。
  • 優化思考:雖然時間復雜度為 O(n2),但在棧操作限制下已是最優解法。

變體思考

  • 如果要降序排序(棧頂為最小元素),只需修改比較條件為 sortedStack.peek() < temp
  • 如果允許使用遞歸(隱式使用調用棧),可以嘗試遞歸解法,但空間復雜度可能更高。

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

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

相關文章

使用Trae編輯器與MCP協議構建高德地圖定制化服務

目錄 一、使用Trae編輯器配置高德MCP Server 1.1 Trae介紹 1.2 從mcp.so中獲取配置高德地圖mcp server配置信息 1.3 高德地圖開發者配置 1.4 添加Filesystem 到Trae 1.5 使用結果展示 1.6 MCP常見命令行工具和包管理說明 1.7 Function Call工具和MCP技術對比 二、本地…

【LLaMA-Factory 實戰系列】三、命令行篇 - YAML 配置與高效微調 Qwen2.5-VL

【LLaMA-Factory 實戰系列】三、命令行篇 - YAML 配置與高效微調 Qwen2.5-VL 1. 引言2. 為什么從 WebUI 轉向命令行&#xff1f;3. 準備工作&#xff08;回顧&#xff09;4. 核心&#xff1a;創建并理解訓練配置文件4.1 選擇并復制基礎模板4.2 逐一解析與修改配置文件4.3 參數詳…

推薦:ToB銷售B2B銷售大客戶營銷大客戶銷售培訓師培訓講師唐興通講銷售技巧數字化銷售銷AI銷售如何有效獲取客戶與業績

站在AI浪潮之巔&#xff0c;重塑銷售之魂 在AI時代&#xff0c;普通銷售人員&#xff08;TOB、TOC&#xff09;除了傳統的銷售動作之外&#xff0c;還能做什么&#xff1f;怎么做&#xff1f; 這是《AI銷冠》這本書想探討的核心問題。 特別喜歡編輯老師總結的&#xff1a; 讀者…

爬取小紅書相關數據導入到excel

本期我們來進行實戰,爬取小紅書的相關數據導入到excel中,后續可進行些數據分析,今后或者已經在運營小紅書的小伙伴應該比較喜歡這些數據。今天我們的主角是DrissionPage,相對于之前介紹的selenium省去了很多的配置,直接安裝了就能使用。 DrissionPage 是一個基于 python …

c++面試題每日一學記錄- C++對象模型與內存對齊深度原理詳解

一、C++對象模型核心原理 1. 對象內存布局基礎原理 設計哲學: 零開銷原則:不為未使用的特性付出代價(如無虛函數則無vptr)兼容性:C結構體在C++中保持相同內存布局多態支持:通過虛函數表實現運行時動態綁定內存布局實現機制: 編譯器處理步驟: 成員排列:嚴格按聲明順序…

Kafka 監控與調優實戰指南(二)

五、Kafka 性能問題剖析 5.1 消息丟失 消息丟失是 Kafka 使用過程中較為嚴重的問題&#xff0c;可能由多種原因導致。在生產者端&#xff0c;如果配置不當&#xff0c;比如將acks參數設置為0&#xff0c;生產者發送消息后不會等待 Kafka broker 的確認&#xff0c;就繼續發送…

Linux下SVN報錯:Unable to connect to a repository at URL ‘svn://XXX‘

一、問題描述 Linux下通過SVN執行提交&#xff08;commit&#xff09;操作時報錯&#xff1a;Unable to connect to a repository at URL svn://XXX&#xff1a; 二、解決方法 導致該問題的一個可能原因是遠程倉庫的URL發生變化了&#xff0c;即svn服務器的ip變更了。這時可…

Modbus 掃描 從站號、波特率

下載鏈接&#xff1a;https://pan.quark.cn/s/533ceb8e397d 下載鏈接: https://pan.baidu.com/s/1PQHn-MwfzrWgF2UrXQDoGg 提取碼: 1111

Docker 容器通信與數據持久化

目錄 簡介 一、Docker 容器通信 1. Docker 網絡模式 2. Bridge 模式 3. Host 模式 4. Container 模式 5. Overlay 模式 6. 端口映射&#xff1a;容器與外部的橋梁 7. 容器互聯&#xff1a;從 --link 到自定義網絡 二、Docker 數據持久化 1. 數據卷&#xff1a;Docke…

【教學類-89-08】20250624新年篇05——元宵節燈籠2CM黏貼邊(倒置和正立數字 )

背景需求&#xff1a; 【教學類-89-06】20250220新年篇05——元宵節燈籠2CM黏貼邊&#xff08;3邊形到50邊形&#xff0c;一頁1圖、2圖、4圖&#xff0c;適合不同水平&#xff0c;適合不同階段&#xff09;-CSDN博客文章瀏覽閱讀1.6k次&#xff0c;點贊35次&#xff0c;收藏27…

【DB2】SQL0104N An unexpected token “OCTETS“ was found following “……

db2創建表時報標題的錯誤&#xff0c;建表語句如下 db2 "CREATE TABLE YS.TEST_1(ID VARCHAR(64 OCTETS))"去掉octets就好了 經過測試&#xff0c;在9.7版本報錯&#xff0c;在10.5.11沒問題&#xff0c;懷疑版本差異導致 在官網查找資料&#xff0c;應該是10.5才…

暴雨以信創委員會成員單位身份參與南京專題活動

6月19日&#xff0c;中國電子工業標準化技術協會信息技術應用創新工作委員會&#xff08;簡稱信創工委會&#xff09;聯合南京市工業和信息化局共同舉辦的“智啟未來&#xff1a;AI賦能信息技術應用創新辦公新勢力”專題活動在南京成功舉辦。南京市工業和信息化局副局長代吉上、…

基于keepalived、vip實現高可用nginx (centos)

基于keepalived、vip實現高可用nginx &#xff08;centos&#xff09; 1、安裝keepalived yum install keepalived2、選同一局域網空置ip作vip 我這里測試是&#xff1a; 主&#xff1a;192.168.163.134 副&#xff1a;192.168.163.135 vip&#xff1a;192.168.163.1403、ke…

使用 launch 啟動 rviz2 并加載機器人模型

視頻資料&#xff1a;《ROS 2機器人開發從入門到實踐》6.2.2 在RViz中顯示機器人_嗶哩嗶哩_bilibili 1、創建工作空間 chapt6_ws/src&#xff0c;創建包 fishrobot_description ros2 create fishrobot_description --build-type ament_cmake --license Apache-2.0 2、創建機器…

華為云Flexus+DeepSeek征文 | 基于CCE容器的AI Agent高可用部署架構與彈性擴容實踐

華為云FlexusDeepSeek征文 | 基于CCE容器的AI Agent高可用部署架構與彈性擴容實踐 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 …

Python學習Day41

學習來源&#xff1a;浙大疏錦行 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; …

數組題解——最長回文子串【LeetCode】

5. 最長回文子串 一、向右拓展 算法思路 你用res記錄當前找到的最長回文子串。每次遍歷到s[i]時&#xff0c;嘗試找到以s[i]結尾的、比當前res更長的回文子串。 先嘗試長度為len(res)2&#xff08;即起點i-len(res)-1&#xff09;的子串&#xff0c;看是不是回文。如果不是&…

?從零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 鏡像并上傳 Docker Hub

&#x1f680; 從零搭建 Ubuntu22.04 Python3.11 PyTorch2.5.1 GPU Docker 鏡像并上傳 Docker Hub 在 AI 項目開發中&#xff0c;構建統一的運行環境是一件非常重要的事情。使用 Docker 可以極大地提升部署效率、保證環境一致性。本文將手把手帶你&#xff1a; ? 構建一個…

紀念抗戰勝利知識答題pk小程序

紀念抗戰勝利知識答題PK小程序通常有以下功能&#xff1a; 一、基礎答題功能 題目展示&#xff1a;清晰呈現題目內容&#xff0c;支持文字、圖片、音頻或視頻等多種形式的題目素材&#xff0c;且能按選擇題、填空題、判斷題等不同題型分類展示。答案提交與判斷&#xff1a;用…

AI模型本質與學習范式解析

從統計學習&#xff08;也就是數學&#xff09;的角度來分析深度學習模型的本質。 頻率派與貝葉斯派對模型本質理解的差異&#xff1a;前者認為學習參數估計&#xff0c;后者認為學習后驗分布。不過這個問題下概率分布的視角更本質。 三個核心部分&#xff1a;任務類型分類&a…