數據結構——棧與棧排序

棧的特性

棧是一種遵循后進先出(LIFO)原則的數據結構。其基本操作包括:

  • push:將元素添加到棧頂。
  • pop:移除棧頂元素。
  • peek:查看棧頂元素,但不移除。
棧排序的原理

棧排序的核心是使用兩個棧:一個原始棧(用于輸入數據)和一個輔助棧(用于排序過程)。通過這兩個棧的相互操作,可以實現數據的排序。

排序實現步驟
  1. 初始化:創建兩個棧,stk(原始棧)和 tmpstk(輔助棧)。

  2. 執行排序

    • 當新元素需要加入原始棧 stk 時,先比較它與輔助棧 tmpstk 頂部元素的大小。
    • 如果輔助棧頂部的元素大于新元素,則將輔助棧的元素移動到原始棧,直至找到合適的位置為新元素騰出空間。
    • 將新元素放入輔助棧。
    • 最終,輔助棧 tmpstk 中的元素將按排序順序存放。
  3. 完成排序:將輔助棧 tmpstk 的元素移回原始棧 stk,此時 stk 中的元素依排序順序排列。

代碼實現
1.在將新元素壓入棧的時候就進行排序

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

class SortedStack {
private:stack<int>stk;stack<int>tmpstk;
public:SortedStack() {}void push(int val) {// 將stk中小于val的元素移到tmpstkwhile (!stk.empty() && stk.top() < val) {tmpstk.push(stk.top());stk.pop();}// 將新元素val壓入stkstk.push(val);// 將tmpstk的元素回填到stk,保持stk的排序while (!tmpstk.empty()) {stk.push(tmpstk.top());tmpstk.pop();}}void pop() {if(!stk.empty())stk.pop();return;}int peek() {if(!stk.empty())return stk.top();return -1;}bool isEmpty() {return stk.empty();}
};

此代碼段展示了棧排序的具體實現。push 函數中的邏輯確保了每次插入新元素后,stk 都會按排序順序重新排列。

2.對一個已經壓入所有元素的棧的排序
while (!st.is_empty()) {int tmp = st.get_top(); st.pop();while (!tmpst.is_empty() && tmp <tmpst.get_top()) {st.push(tmpst.get_top());tmpst.pop();}tmpst.push(tmp);}while (!tmpst.is_empty() {st.push(tmpst.get_top());tmpst.pop();}
代碼解釋
  1. 第一個 while 循環:該循環負責進行排序。

    • while (!st.is_empty()):當主棧 st 不為空時,執行循環體。
    • int tmp = st.get_top(); st.pop();:取出 st 棧頂元素并存儲在 tmp 中,然后將該元素從 st 彈出。
    • while (!tmpst.is_empty() && tmp < tmpst.get_top()):如果輔助棧 tmpst 不為空且 tmp 小于 tmpst 的棧頂元素,則執行內部循環。
      • st.push(tmpst.get_top());:將 tmpst 的棧頂元素移回 st
      • tmpst.pop();:從 tmpst 彈出棧頂元素。
    • tmpst.push(tmp);:將 tmp 壓入 tmpst
  2. 第二個 while 循環:該循環將排序后的元素從 tmpst 移回 st

    • while (!tmpst.is_empty()):當輔助棧 tmpst 不為空時,執行循環體。
    • st.push(tmpst.get_top());:將 tmpst 的棧頂元素壓入 st
    • tmpst.pop();:從 tmpst 彈出棧頂元素。
  3. 模擬過程
st: [4, 2, 3, 1] (棧頂是 1)
tmpst: []第一步:處理元素 1
從 st 彈出 1 (tmp = 1)。
tmpst 是空的,所以直接將 1 壓入 tmpst。st: [4, 2, 3] (棧頂是 3)
tmpst: [1]第二步:處理元素 3
從 st 彈出 3 (tmp = 3)。
tmpst 的棧頂元素 1 小于 3,所以不需要移動元素,直接將 3 壓入 tmpst。st: [4, 2] (棧頂是 2)
tmpst: [3, 1]第三步:處理元素 2
從 st 彈出 2 (tmp = 2)。
tmpst 的棧頂元素 3 大于 2,所以將 3 移回 st。現在 tmpst 的棧頂元素 1 小于 2,直接將 2 壓入 tmpst。st: [4, 3] (棧頂是 3)
tmpst: [2, 1]第四步:處理元素 3
從 st 彈出 3 (tmp = 3)。
tmpst 的棧頂元素 2 小于 3,不需要移動元素,直接將 3 壓入 tmpst。st: [4] (棧頂是 4)
tmpst: [3, 2, 1]第五步:處理元素 4
從 st 彈出 4 (tmp = 4)。
tmpst 的棧頂元素 3 小于 4,所以直接將 4 壓入 tmpst。st: []
tmpst: [4, 3, 2, 1]完成排序
將 tmpst 中的元素按順序移回 st,得到排序后的棧。
st: [1, 2, 3, 4] (棧頂是 4)
tmpst: []
優勢和局限性
  • 優勢:棧排序提供了一種直觀理解排序邏輯的方法,同時也是對棧操作的良好練習。
  • 局限性:棧排序的效率相對較低,特別是在處理大量數據時。它的時間復雜度為 O(n2),不適合用于性能敏感的應用。

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

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

相關文章

[滲透測試學習] Devvortex - HackTheBox

文章目錄 信息搜集解題步驟提交flag 信息搜集 掃描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.242發現80端口有http服務&#xff0c;并且是nginx服務 嘗試訪問web界面&#xff0c;發現跳轉到http://devvortex.htb/無法訪問 我們用vim添加該域名即可 sudo vim /etc/…

J.408之數據結構

J-408之數據結構_北京信息科技大學第十五屆程序設計競賽&#xff08;同步賽&#xff09; (nowcoder.com) 思維好題&#xff0c;直接用兩個set存沒出現的數字就好了 // Problem: 408之數據結構 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…

ClickHouse安裝和部署

ClickHouse安裝過程&#xff1a; ClickHouse支持運行在主流64位CPU架構&#xff08;X86、AArch和PowerPC&#xff09;的Linux操作 系統之上&#xff0c;可以通過源碼編譯、預編譯壓縮包、Docker鏡像和RPM等多種方法進行安裝。由于篇幅有限&#xff0c;本節著重講解離線RPM的安…

RAW和YUV的區別

RAW是指未經過任何壓縮或處理的原始圖像數據。在攝像頭中&#xff0c;原始圖像數據可以是來自圖像傳感器的未經處理的像素值。這些原始數據通常以一種Bayer模式的形式存在&#xff0c;其中每個像素僅包含一種顏色信息&#xff08;紅色、綠色或藍色&#xff09;&#xff0c;需要…

【開源】基于Vue和SpringBoot的在線課程教學系統

項目編號&#xff1a; S 014 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S014&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S014&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 系統介紹1.2 項目錄屏 二、研究內容2.1 課程類型管理模塊2.2 課程管理模塊2…

Redis Bitmaps 數據結構模型位操作

Bitmaps 數據結構模型 Bitmap 本身不是一種數據結構&#xff0c;實際上它就是字符串&#xff0c;但是它可以對字符串的位進行操作。 比如 “abc” 對應的 ASCII 碼分別是 97、98、99。對應的二進制分別是 01100010、01100010、01100011, 如下所示&#xff1a; a b …

HTML5+CSS3+JS小實例:文字依次點擊驗證

實例:文字依次點擊驗證 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

十七、FreeRTOS之FreeRTOS事件標志組

本節需要掌握以下內容&#xff1a; 1&#xff0c;事件標志組簡介&#xff08;了解&#xff09; 2&#xff0c;事件標志組相關API函數介紹&#xff08;熟悉&#xff09; 3&#xff0c;事件標志組實驗&#xff08;掌握&#xff09; 4&#xff0c;課堂總結&#xff08;掌握&am…

04_W5500_TCP_Server

上一節我們完成了TCP_Client實驗&#xff0c;這節使用W5500作為服務端與TCP客戶端進行通信。 目錄 1.W5500服務端要做的&#xff1a; 2.代碼分析&#xff1a; 3.測試&#xff1a; 1.W5500服務端要做的&#xff1a; 服務端只需要打開socket&#xff0c;然后監聽端口即可。 2…

基于Spring Boot的水產養殖管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于Spring Boot的水產養殖管理系統,jav…

HarmonyOS Developer——鴻蒙【構建第一個JS應用(FA模型)】

創建JS工程 JS工程目錄結構 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 使用真機運行應用 說明 為確保運行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本為例&#xff0c;點擊此處獲取下載鏈接。 創建JS工程 若首次打開DevEco Studio&#xff0c;請點擊…

蝦皮什么商品好賣

在蝦皮&#xff08;Shopee&#xff09;平臺上&#xff0c;有許多商品類別都表現出了較好的銷售情況。然而&#xff0c;隨著時間和地區的變化&#xff0c;熱銷商品也會有所不同。本文將介紹一些在蝦皮平臺上表現較好的商品類別&#xff0c;并提供一些建議&#xff0c;幫助您在蝦…

交換機基本原理和配置

目錄 一、數據鏈路層功能 二、交換機的工作原理 三、交換機的四大功能 一、數據鏈路層功能 位于網絡層與物理層之間 數據鏈路的建立、維護與拆除幀包裝、幀傳輸、幀同步幀的差錯恢復流量控制 二、交換機的工作原理 交換機通過數據幀的源 MAC 地址&#xff0c;學習到交換機端…

偶數位字符前置算法

題目描述&#xff1a; 題目描述 編寫函數void myshift(char *s),在不打亂s原本相對位置情況下&#xff0c;將偶數位上的字符全部挪到奇數位字符的前面。輸入格式 輸入一個字符串 s保證輸入字符串 s 的長度大于等于1小于等于100輸出格式 輸出修改后的字符串 s。輸入樣例1 01234…

【算法】直接插入排序

目錄 1. 說明2. 舉個例子3. java代碼示例4. java示例截圖 1. 說明 1.直接插入排序的方式和打牌一樣&#xff0c;剛開始數組為空 2.拿到一個數字后從左到右將它與數組中的每一個數字進行比較&#xff0c;然后插入合適的位置 3.到最后&#xff0c;數組按照既定的順序排序好 2. 舉…

OpenCV基礎篇

OpenCV基礎篇 一、圖像、視頻讀取二、cv::Mat()數據類型三、繪圖功能四、鼠標響應事件五、圖像像素讀寫六、圖像像素運算七、顏色空間轉換八、圖像幾何變換九、圖像濾波十、圖像二值化十一、圖像梯度十二、Canny邊緣檢測十三、圖像形態學十四、圖像直方圖十五、霍夫變換十六、分…

線程池的拒絕策略

文章目錄 線程池的拒絕策略AbortPolicy拒絕策略&#xff1a;CallerRunsPolicy拒絕策略&#xff1a;DiscardOldestPolicy拒絕策略&#xff1a;DiscardPolicy拒絕策略&#xff1a; 線程池的拒絕策略 若在線程池當中的核心線程數已被用完且阻塞隊列已排滿&#xff0c;則此時線程池…

springboot_ssm_java學位論文盲審系統

本系統主要實現用戶登錄驗證&#xff0c;用戶使用郵箱&#xff0c;密碼和選擇身份進行登錄&#xff0c;用戶查看個人中心&#xff0c;提交論文&#xff0c;發表留言和問題反饋。用戶在線注冊。學生模塊功能實現&#xff1a;學生注冊&#xff0c;查看信息&#xff0c;修改資料&a…

智能優化算法應用:基于魚鷹算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于魚鷹算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于魚鷹算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.魚鷹算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

藍橋杯航班時間

藍橋杯其他真題點這里&#x1f448; //飛行時間 - 時差 已過去的時間1 //飛行時間 時差 已過去的時間2 //兩個式子相加會發現 飛行時間 兩段時間差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…