【算法 day09】LeetCode 232.用棧實現隊列 | 225. 用隊列實現棧 | 20. 有效的括號 |1047. 刪除字符串中的所有相鄰重復項

232.用棧實現隊列

題目鏈接 | 文檔講解 |視頻講解 :?鏈接

?1.思路:
  • ? 使用2個棧去實現隊列

  • ? 先將元素放入棧1中,然后在將棧1中的元素出棧到棧2中,棧2的元素出棧順序就和隊列的出隊一樣

?2.代碼:
class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {//負責入隊stackIn=new Stack<>();//負責出隊stackOut=new Stack<>();}public void push(int x) {stackIn.push(x); }public int pop() {judge();return stackOut.pop(); }public int peek() {judge();return stackOut.peek();}public boolean empty() {//輸入和輸出棧都為空,說明隊列為空return stackIn.isEmpty()  && stackOut.isEmpty();}public void judge(){if(!stackOut.isEmpty()){return;}while(!stackIn.isEmpty()){stackOut.push(stackIn.pop());}}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

225. 用隊列實現棧

題目鏈接 | 文檔講解 |視頻講解:鏈接

?1.思路:
  • ? ? ? ? 使用2個隊列實現,一個用于保持與棧的出入順序一致 q1,另一個用于輔助q2

  • ? ? ? ? push():利用兩個隊列,完成元素的倒騰,使得新加入的元素稱為棧頂

  • ? ? ? ? pop(): 由于push的時候已經與棧順序元素一致,直接返回隊首即可

  • ? ? ? ? top(): 同上

  • ? ? ? ?empty() :只需要判斷q1

?2.代碼:

public class MyStack {//與棧的出入順序保持一致Queue<Integer> q1 = new ArrayDeque<>();//輔助Queue<Integer> q2 = new ArrayDeque<>();public MyStack() {}public void push(int x) {//放入 [1,2]//1:q1[1] q2[]//2: q1[] q2[1] ------  q1[2,1] q2[]//將q1元素倒入q2while (q1.size()>0){q2.add(q1.poll());}//將元素放入q1中q1.add(x);//將q2元素倒回q1,把持棧頂在最前面while (q2.size()>0){q1.add(q2.poll());}}public int pop() {return  q1.poll();}public int top() {return q1.peek();}public boolean empty() {return q1.isEmpty();}
}

1.思路:

? ? ? ?使用一個雙端隊列實現棧

? ? ? ?push使用?ArrayDeque 在隊尾添加元素,

? ? ? pop的時候,將ArrayDeque中的size-1的元素先pollFirst()出去,在添加到隊尾

2.代碼:

public class MyStack2 {//Deque 接口繼承了 Queue 接口//所以 Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirstDeque<Integer> deque;public MyStack2() {deque=new ArrayDeque<>();}public void push(int x) {// 1 2//往隊尾加deque.addLast(x);}public int pop() {int size = deque.size();size--;while (size-- > 0) {deque.addLast(deque.pollFirst());}return deque.pollFirst();}public int top() {//棧頂元素return deque.peekLast();}public boolean empty() {return deque.isEmpty();}
}
操作MyStack(兩個隊列)MyStack2(一個 Deque)
數據結構兩個普通隊列一個雙端隊列
push 位置插入 q1,然后倒騰 q2,使新元素在隊首插入隊尾
push 時間O(n),需要兩次倒騰O(1),直接插入
pop 位置直接從 q1 隊首彈出把前 n-1 個元素重新放到隊尾,最后彈出
pop 時間O(1)O(n)
peek 時間O(1)O(1)
優點pop 快,適合頻繁出棧場景結構簡單,空間少
缺點空間多,push 慢pop 慢,不適合頻繁出棧

20. 有效的括號

題目鏈接 | 文檔講解 |視頻講解:鏈接

?1.思路:
  • ? ??使用棧去解決

  • ? ?括號的類型有 (,{,[ 三種,如果當前遍歷的元素時上述三種,則分別向棧中添加 ),},] ,如果當前遍歷的元素不是上述三種情況,判斷棧為空 || 棧頂元素與當前元素不相等,返回false?

  • ? 循環外,判斷當前棧是否為空即可

?2.代碼:
  public boolean isValid(String s) {Stack<Character> stack=new Stack<>();char [] arr=s.toCharArray();for(char c : arr){if(c == '('){stack.push(')');}else if(c =='{'){stack.push('}');}else if(c=='['){stack.push(']');} else if(stack.isEmpty() || c!= stack.pop()){return false;}}return stack.isEmpty();}

1047. 刪除字符串中的所有相鄰重復項

題目鏈接 | 文檔講解 |視頻講解:鏈接

?1.思路:?
  • ? ? 使用棧去解決

  • ? ? 當棧不為空且棧頂元素和當前遍歷的元素一樣,就將棧頂元素彈出去,其余情況就往棧中添加元素

  • ? ?棧中剩余的元素就是字符串中不重復的元素,但是與要求的元素的順序是相反的,需要將順序顛倒過來

?2.代碼:
 public static String removeDuplicates(String str) {ArrayDeque<Character> queue = new ArrayDeque<>();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);//當棧不為空且棧首元素和當前字符串所在元素一樣,就彈出棧首if(!queue.isEmpty() && queue.peek()==c){queue.pop();}else{//往棧中添加元素queue.push(c);}}//剩余元素為不重復的元素String res="";while (!queue.isEmpty()){res=queue.pop()+res;}return res;}

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

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

相關文章

大模型項目實戰:業務場景和解決方案

你的這張圖已經涵蓋了很多主流的大模型實戰項目&#xff0c;非常全面&#xff01;下面我會補充更多市面上常見的AI大模型實戰項目&#xff0c;并且簡要說明每個項目的核心內容、實現思路和主流技術棧&#xff0c;方便你參考和擴展。 1. 智能問答/知識庫系統 核心內容&#xff…

vscode + Jlink 一鍵調試stm32 單片機程序(windows系統版)

vscode Jlink 一鍵調試stm32 單片機程序 安裝交叉編譯工具鏈安裝 x-pack 構建工具安裝 JLink 工具gnu-debuger 插件編譯一鍵啟動調試 安裝交叉編譯工具鏈 stm32采用 交叉編譯工具鏈 arm-none-eabi-xxx, 下載之后解壓&#xff0c;壓縮包內部結構如下圖&#xff1a; 目錄下的bi…

Linux線程概念和控制

Linux線程概念 Linux中線程如何理解 線程<執行流<進程 Linux中的線程模擬進程實現&#xff08;線程就是輕量級進程&#xff09; 與獨立的進程相比&#xff0c;線程創建和銷毀的開銷較小&#xff0c;因為它們共享相同的內存空間和資源。 線程是進程內的執行分支&…

服務器出現問題,連接服務器出現3680 并刪除數據庫出現1192,請查看詳細問題(運維)

mysql連接服務器時&#xff0c;出現這個問題&#xff1a;3680 - Failed to create schema directory xxxx (errno: 28 - No space left on device) 第一步&#xff1a;診斷問題類型 檢查磁盤空間 運行以下命令&#xff1a; bash df -h # 查看磁盤使用情況 如果輸出中 Use% 接…

uniapp:微信小程序膠囊「復制鏈接」灰色處理

在原生開發的小程序中默認是支持復制的 &#x1f424; 但是在 uniapp 開發的小程序中無法復制&#xff08;體驗版與開發版都可以進行復制&#xff0c;但發布后不可&#xff09; 解決方法&#xff1a; methods: {onShareAppMessage: function() {// return custom share data …

差分數組c++

溫度波動記錄 每天記錄溫度&#xff0c;支持區間溫度調整和單日查詢 輸入&#xff1a; 第一行&#xff1a;一個整數n表示有n個溫度 第二行&#xff1a;n個數表示具體溫度 第三行&#xff1a;三個整數&#xff1a;S&#xff0c;e&#xff0c;c&#xff0c;表示從…

Vue.js 列表過濾實現詳解(watch和computed實現)

Vue.js 列表過濾實現詳解 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthd…

性能測試-jmeter實戰4

課程&#xff1a;B站大學 記錄軟件測試-性能測試學習歷程、掌握前端性能測試、后端性能測試、服務端性能測試的你才是一個專業的軟件測試工程師 性能測試-jmeter實戰4 jmeter環境搭建1. 安裝Java環境&#xff08;必需&#xff09; JMeter環境搭建完整指南1. 安裝Java&#xff0…

GPPT(Graph Pre-training and Prompt Tuning)項目復現

GPPT(Graph Pre-training and Prompt Tuning)項目復現 項目概述 GPPT是一種創新的圖神經網絡預訓練與提示調整框架,由MingChen-Sun等人提出。該項目通過將自然語言處理中的提示學習概念引入圖領域,解決了圖預訓練模型在下游任務中的適應性問題。 環境配置 # 創建Python…

anchor 智能合約 IDL 調用

簡介&#xff1a;通過 IDL 生成代碼 調用 anchor 智能合約。 全網首發 使用 anchor 可以快速開發 solana 上面的智能合約 &#xff0c; 在本案例中我們 先使用 anchor 創建一個只能合約&#xff08; 多個函數方法&#xff09;。 部署到 dev 鏈上。 通過 anchor 的 IDL 生成 代碼…

【Clickhouse系列】事務

目錄 1. 標準 ACID 支持場景 (MergeTree 引擎家族) 2. 非 ACID 場景 3. 實驗性事務功能 (非云環境) 總結 參考文檔 事務性 (ACID) 支持 | ClickHouse Docs ClickHouse ACID 支持核心要點 1. 標準 ACID 支持場景 (MergeTree 引擎家族) ? 單分區插入 (原子塊) ? ? 原子性…

在cursor中,配置jdk和maven環境,安裝拓展插件

目錄 1.手動配置jdk和maven 2.安裝java拓展插件 1.手動配置jdk和maven 第一步&#xff1a;按ctrl shift p, 搜索“Preferences: Open User Settings (JSON)” 并回車&#xff0c;打開 settings.json 文件 。然后添加或修改以下內容&#xff1a; "java.home": &qu…

(線性代數最小二乘問題)Normal Equation(正規方程)

Normal Equation&#xff08;正規方程&#xff09; 是線性代數中的一個重要概念&#xff0c;主要用于解決最小二乘問題&#xff08;Least Squares Problem&#xff09;。它通過直接求解一個線性方程組&#xff0c;找到線性回歸模型的最優參數&#xff08;如權重或系數&#xff…

在架構設計中平衡動態語言與靜態語言部署差異的策略分析

在軟件架構設計過程中&#xff0c;語言的選型不僅僅關乎開發效率&#xff0c;更直接影響系統的部署速度、運行性能與維護成本。動態語言&#xff08;如 Python、Node.js&#xff09;部署快、開發靈活&#xff1b;靜態語言&#xff08;如 Go、Java、Rust&#xff09;性能強、類型…

我的VSCode中那些插件

前言 最近在研究VUE.JS&#xff0c;而VUE官方推薦使用VSCode作為開發工具&#xff0c;因此最近才開始大量使用這個工具。在使用過程中&#xff0c;總會遇到一些視頻博主推薦某某插件&#xff0c;于是我都將其安裝在我的VSCode上。這里記錄一下&#xff0c;僅供參考。 插件列表…

C# 時間格式日期格式使用合集

一、常用整理 C#時間使用整理,DateTime 使用整理_c#時間格式-CSDN博客 C# 本地時間格式&#xff0c;UTC時間格式&#xff0c;GMT時間格式處理 二、 C#如何獲取今天零點的時間 C# 獲取周一、周日 三、 C#計算兩個時間年份月份差 C#時間點字符串轉換為日期&#xff0c;當…

Ribbon負載均衡的具體實現原理

Ribbon 是 Netflix 開源的一款客戶端負載均衡工具&#xff0c;廣泛應用于微服務架構中&#xff0c;用于在客戶端選擇目標服務實例。 以下是 Ribbon 負載均衡的具體實現原理&#xff1a; 1. 什么是 Ribbon Ribbon 是一個客戶端負載均衡器&#xff0c;負責從服務注冊中心&#…

iOS APP上架App Store實踐:通過自動化流程和輔助工具高效提

在現代開發流程中&#xff0c;持續集成&#xff08;CI&#xff09;已經成為必不可少的環節。對于iOS應用的開發與發布&#xff0c;持續集成不僅限于構建過程&#xff0c;還應該涵蓋從代碼提交到版本發布的整個生命周期。然而&#xff0c;由于iOS平臺對開發環境的限制&#xff0…

3443. K 次修改后的最大曼哈頓距離

3443. K 次修改后的最大曼哈頓距離 題目鏈接&#xff1a;3443. K 次修改后的最大曼哈頓距離 代碼如下&#xff1a; class Solution { public:int maxDistance(string s, int k) {int res 0;// 定義一個大小為 X&#xff08;88&#xff09;的數組&#xff0c;并初始化為 0int…

【Ubuntu】Windows11安裝虛擬機超詳細圖文教程(VMware17.6.1 + ubuntu-24.04.2)

目錄 前言 一、準備工作 1、工具安裝包 2、獲取方式 3、本人的電腦安裝環境介紹 二、虛擬機磁盤分區&#xff08;可選&#xff09; 1、分區助手安裝 2、為虛擬機準備一個單獨的磁盤分區 三、VMware安裝 四、ubuntu鏡像安裝 1、Ubuntu鏡像iso文件加載引導 2、Ubuntu…