【java】【python】leetcode刷題記錄--棧與隊列

232 用棧實現隊列

題目描述
兩個棧模擬隊列的思路是利用棧(后進先出結構)的特性來實現隊列(先進先出結構)的行為。這種方法依賴于兩個棧來逆轉元素的入隊和出隊順序,從而實現隊列的功能。

入隊操作(使用stackIn):所有新加入的元素都直接推入stackIn。因為棧支持后進先出,所以此時不需要考慮元素的順序。

出隊操作(使用stackOut):當需要進行出隊操作(即移除隊列的最前端元素)時,我們先檢查stackOut:如果stackOut為空,則將stackIn中所有元素逐一彈出并推入stackOut。這樣,最先進入stackIn的元素(也就是最早入隊的元素)會位于stackOut的頂部。如果stackOut不為空,則直接從stackOut彈出頂部元素(隊列的前端元素)。

通過這種方式,stackOut的棧頂始終保持為隊列的最前端,而stackIn用于處理新的入隊操作。

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() {// 將in棧的內容全部轉移到out棧,從out棧進行輸出// 如果out棧有內容就先輸出if(stackOut.empty()){while(!stackIn.empty()){stackOut.push(stackIn.pop());}}return stackOut.pop();}public int peek() {if(stackOut.empty()){while(!stackIn.empty()){stackOut.push(stackIn.pop());}}return stackOut.peek();}public boolean empty() {return (stackIn.empty())&&(stackOut.empty());}
}/*** 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 用隊列實現棧

題目鏈接
這題也是利用兩個隊列來進行元素順序的調整。

queue2是輔助隊列,queue1存放進入棧的元素,當想要得到棧頂(隊尾)元素,即把queue1的元素放入queue2,知道queue1只剩一個元素,該元素則為棧頂元素。將其彈出即可。剩余操作也是類似。

class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();}public void push(int x) {queue2.offer(x); // 先放在輔助隊列中while (!queue1.isEmpty()){queue2.offer(queue1.poll());}Queue<Integer> queueTemp;queueTemp = queue1;queue1 = queue2;queue2 = queueTemp; // 最后交換queue1和queue2,將元素都放到queue1中}/** Removes the element on top of the stack and returns that element. */public int pop() {return queue1.poll(); // 因為queue1中的元素和棧中的保持一致,所以這個和下面兩個的操作只看queue1即可}/** Get the top element. */public int top() {return queue1.peek();}/** Returns whether the stack is empty. */public boolean empty() {return queue1.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

python版本:

from queue import Queueclass MyStack:def __init__(self):self.queue1 = Queue()def push(self, x):# 臨時隊列,用于轉移元素temp_queue = Queue()temp_queue.put(x)  # 先放入新元素(棧頂元素)# 將原隊列中的元素轉移到臨時隊列中,確保新元素始終在隊列頭部while not self.queue1.empty():temp_queue.put(self.queue1.get())self.queue1 = temp_queue  # 更新隊列為新的隊列def pop(self):# 直接從 queue1 中取出元素,因為 queue1 的隊頭是棧頂return self.queue1.get()def top(self):# 獲取隊頭元素即棧頂元素top_element = self.queue1.get()# 為保持隊列狀態,將該元素重新放回隊頭temp_queue = Queue()temp_queue.put(top_element)while not self.queue1.empty():temp_queue.put(self.queue1.get())self.queue1 = temp_queue  # 更新隊列return top_elementdef empty(self):# 如果 queue1 為空,則棧為空return self.queue1.empty()

20 有效的括號

題目描述
很經典的棧的題目。

如果遇到左括號則要入棧,遇到右括號則與棧頂的元素配對,配對失敗則是false,反之繼續配對。這里要特別注意,右括號來的適合左括號可能為空,這是false。或者最后左括號剩余,這也是false。

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(int i=0; i<s.length(); i++){char tmp = s.charAt(i);if (tmp == '(' || tmp == '{' || tmp == '[') {stack.push(tmp);} else {if (stack.empty()) return false; // 先檢查棧是否為空char top = stack.pop(); // 彈出棧頂元素以匹配if (tmp == ')' && top != '(') return false;if (tmp == '}' && top != '{') return false;if (tmp == ']' && top != '[') return false;}}return stack.empty();}
}

python版本:

class Solution:def isValid(self, s: str) -> bool:stack = []for char in s:if char in '({[':stack.append(char)else:if not stack:return False  # 檢查棧是否為空top = stack.pop()  # 彈出棧頂元素以匹配if char == ')' and top != '(':return Falseif char == '}' and top != '{':return Falseif char == ']' and top != '[':return Falsereturn not stack  # 棧空則有效,非空則無效

當然,這題也可以用set(map)進行查找的優化,但意義不太大。比如如下代碼:


import java.util.HashMap;
import java.util.Stack;public class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();HashMap<Character, Character> map = new HashMap<>();// 存儲括號對應關系map.put(')', '(');map.put('}', '{');map.put(']', '[');for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 如果是右括號if (map.containsKey(c)) {// 棧為空或棧頂元素不匹配當前右括號對應的左括號if (stack.isEmpty() || stack.pop() != map.get(c)) {return false;}} else {// 否則為左括號,壓入棧中stack.push(c);}}// 如果棧為空,說明所有括號都匹配成功return stack.isEmpty();}
}

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

題目鏈接
第一眼還以為要雙指針或者滑動窗口,但并不用,雙指針往往是對數組/字符串/鏈表進行操作,滑動窗口則是找子序列/最大長度這種。

這題實際上就是棧的應用,沒遇到一個新元素就入棧,如果棧頂元素與新的元素相同,則把棧頂元素出棧,以此類推。

關于java的StringBuider,看這篇:鏈接

class Solution {public String removeDuplicates(String s) {Stack<Character> stack = new Stack<>();for(int i=0; i<s.length(); i++){char tmp = s.charAt(i);if(!stack.isEmpty() && stack.peek()==tmp){stack.pop();}else{stack.push(tmp);}}StringBuilder res = new StringBuilder();for (char ch : stack) {res.append(ch);}return res.toString();}
}

python版本:join可以方便的把列表轉換為字符串。如果不用join那會浪費一些時間。

class Solution:def removeDuplicates(self, s: str) -> str:stack = []for char in s:if stack and stack[-1] == char:stack.pop()else:stack.append(char)return ''.join(stack)#或者這樣res = ''for c in stack:res = res + creturn res

150 逆波蘭表達式求值

題目鏈接
題目很簡單,如果了解后綴表達式很輕松能寫出來,將數字存在棧中,遇到符號取出棧頂的2個元素計算,再將結果放回棧內即可。

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {int b = stack.pop();  // 先彈出的是第二個操作數int a = stack.pop();  // 再彈出的是第一個操作數switch (token) {case "+":stack.push(a + b);break;case "-":stack.push(a - b);break;case "*":stack.push(a * b);break;case "/":stack.push(a / b);break;}} else {// 直接將字符串轉換為整數并壓棧stack.push(Integer.parseInt(token));}}// 最終棧頂元素就是表達式的結果return stack.peek();}
}

python版本:

class Solution:def evalRPN(self, tokens: List[str]) -> int:res = []print(int(6/(-132)))for token in tokens:if token not in {'+', '-', '*', '/'}:res.append(int(token))else:a = res.pop()b = res.pop()if token == '+':res.append(a+b)elif token == '-':res.append(b-a)elif token == '*':res.append(a*b)elif token == '/':res.append(int(b/a))return res[0]

在Python中,對于整數除法,/ 操作符執行的是真除法(返回浮點結果),而 // 操作符執行的是地板除(即對結果向下取整到最近的整數)。因此,當使用 / 并將結果強制轉換為 int 時,它只是簡單地去掉了小數部分,不進行四舍五入,而且對于負數結果也只是截斷小數部分。而使用 //,則是在計算結果后直接返回一個整數,且結果總是向下取整,這種方式與C++和Java中的整數除法一致。

對于正數除法:

  • 5 / 2 結果為 2.5,int(5 / 2) 結果為 2
  • 5 // 2 結果為 2。

對于負數除法:

  • -5 / 2 結果為 -2.5,int(-5 / 2) 結果為 -2。
  • -5 // 2 結果為 -3,因為 -2.5 向下取整是 -3。

因此這里要使用轉換為int,而不是//。

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

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

相關文章

GIS、GPS、RS綜合應用

劉老師&#xff08;副教授&#xff09;&#xff0c;北京重點高校資深專家&#xff0c;擁有豐富的科研及工程技術經驗&#xff0c;長期從事3S在環境中的應用等領域的研究和教學工作&#xff0c;具有資深的技術底蘊和專業背景。 第一章、3S 技術及應用簡介 1.1、3S 技術及集成簡…

前端技術專家崗(虛擬崗)

定位&#xff1a; 團隊技術負責人、技術領導者&#xff1b;確保框架、工具的低門檻、高性能、可擴展&#xff1b; 素質要求&#xff1a; 具備架構設計能力&#xff1b;一個或者多個領域的技術專家&#xff1b;較為豐富的基礎建設經驗&#xff1b;項目管理能力、任務分解、協…

跨模型知識融合:大語言模型的知識融合

大語言模型&#xff08;LLMs&#xff09;在多個領域的應用日益廣泛&#xff0c;但確保它們的行為與人類價值觀和意圖一致卻充滿挑戰。傳統對齊方法&#xff0c;例如基于人類反饋的強化學習&#xff08;RLHF&#xff09;&#xff0c;雖取得一定進展&#xff0c;仍面臨諸多難題&a…

1211. 查詢結果的質量和占比

1211. 查詢結果的質量和占比 題目鏈接&#xff1a;1211. 查詢結果的質量和占比 代碼如下&#xff1a; # Write your MySQL query statement below select query_name,round(avg(rating/position),2) as quality,round(sum(if(rating<3,1,0))*100/count(*),2) as poor_quer…

wandb安裝與使用 —— 用于跟蹤、可視化和協作機器學習實驗的工具

文章目錄 一、wandb簡介二、wandb注冊與登陸&#xff08;網頁&#xff09; —— 若登錄&#xff0c;則支持在線功能三、wandb安裝與登陸&#xff08;命令行&#xff09; —— 若不登錄&#xff0c;則只保留離線功能四、函數詳解4.1、wandb.init() —— 初始化一個新的 wandb 實…

上位機圖像處理和嵌入式模塊部署(f407 mcu中fatfs中間件使用)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 前面我們已經實現了spi norflash的驅動&#xff0c;理論上這已經可以實現數據的持久化保存了。為什么還需要一個文件系統呢&#xff1f;主要原因還…

在 Win系統安裝 Ubuntu20.04子系統 WSL2 (默認是C盤,第7步開始遷移到D盤,也可以不遷移)

1、簡介 WSL在Windows 10上原生運行Linux二進制可執行文件&#xff0c;不用單獨安裝虛擬機。 WSL2是WSL的第二個版本&#xff0c;提供了與WSL相比的顯著性能改進和完全的系統呼叫兼容性。通過運行Linux內核在一個輕量級虛擬機&#xff08;VM&#xff09;中實現。 2、安裝 電…

ThingsBoard MQTT 連接認證過程 源碼分析+圖例

整個連接過程如圖所示&#xff1a; 高清圖片鏈接 1、環境準備 thingsboard3.5.1 源碼啟動。&#xff08;不懂怎么啟動的&#xff0c;大家可以看我的博文ThingsBoard3.5.1源碼啟動&#xff09;MQTTX 客戶端&#xff08;用來連接 thingsboard MQTT&#xff09;默認配置。queue.…

7-15 位模式(dump_bits)---PTA實驗C++

一、題目描述 為方便調試位運算相關程序&#xff0c;先做個展現位模式的小工具。 建議參照以下接口實現&#xff1a; // 利用函數重載特性&#xff1a;string dump_bits(char x);string dump_bits(short x);string dump_bits(int x);string dump_bits(long long x);// 或用函…

JVM類加載過程

在Java虛擬機規范中&#xff0c;把描述類的數據從class文件加載到內存&#xff0c;并對數據進行校驗、轉換解析和初始化&#xff0c;最終形成可以被虛擬機直接使用的java.lang.Class對象&#xff0c;這個過程被稱作類加載過程。一個類在整個虛擬機周期內會經歷如下圖的階段&…

C++編程法則365天一天一條(323)main函數執行之前和之后的動作

在C和C程序中&#xff0c;main 函數之前和之后執行的函數是由編譯器、鏈接器和運行時環境共同決定的。以下是一些通常會在這些階段執行的關鍵函數&#xff1a; 在 main 函數之前執行的函數 啟動代碼&#xff08;Start-up Code&#xff09;: 這是由編譯器提供的一段代碼&#…

DIYP對接駱駝后臺IPTV管理,退出菜單中顯示用戶名已經網絡信息,MAC,剩余天數,套餐名稱等

演示&#xff1a;https://url03.ctfile.com/f/1779803-1042599473-4dc000?p8976 (訪問密碼: 8976) 后臺加上EPG&#xff0c;增加一些播放源的動態端口替換。 前臺app上&#xff0c;退出菜單中顯示用戶名已經網絡信息&#xff0c;MAC&#xff0c;剩余天數&#xff0c;套餐名稱…

Python知識點17---包

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的包&#xff0c;你可以把它看成是一個大的模塊&#xff0c;它…

JAVA基礎|多線程

什么是線程&#xff1f; 線程&#xff08;Thread&#xff09;是一個程序內部的一條執行流程。 多線程是什么&#xff1f; 多線程是指從軟硬件上實現的多條執行流程的技術&#xff08;多條線程由CPU負責調度執行&#xff09; 一. 如何在程序中創建出多條線程&#xff1f; Ja…

新接手業務的線上Bug特別多怎么辦?

文章目錄 接手&#xff1a;保證質量順利過渡緊急質量審計臨時增加測試頻次灰度發布加強監控與預警建立快速反饋機制 打補丁&#xff1a;針對性解決質量問題Bug 分析與分類測試策略優化環境一致性 搞基建&#xff1a;全流程質量控制需求分析與評審設計階段的評審與驗證代碼質量控…

Windows10系統中安裝與配置PyTorch(無GPU版本)

文章目錄 1. 什么是PyTorch2. PyTorch的安裝與配置&#xff08;無GPU&#xff09;2.1 創建環境2.2 安裝pytorch庫&#xff08;無GPU&#xff09;2.3 驗證安裝結果 1. 什么是PyTorch PyTorch 是一種用于構建深度學習模型且功能完備的開源框架&#xff0c;通常用于處理圖像識別和…

JVM學習-自定義類加載器

為什么要自定義類加載器 隔離加載類 在某些框架內進行中間件與應用的模塊隔離&#xff0c;把類加載到不同的環境&#xff0c;如Tomcat這類Web應用服務器&#xff0c;內部自定義了好幾種類加載器&#xff0c;用于隔離同一個Web應用服務器上的不同應用程序 修改類加載的方式 …

OpenCV 的幾種查找圖像中輪廓邊緣的方法

原始圖片&#xff1a; 1、Sobel() Sobel 算子結合了高斯平滑和微分&#xff0c;用于計算圖像的梯度&#xff0c;從而突出顯示邊緣。 import cv2# 讀取圖像 image cv2.imread(image.png, cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直邊緣 sobel_x cv2.Sobel(image…

建筑企業有閑置資質怎么辦?

如果建筑企業擁有閑置資質&#xff0c;可以考慮以下幾種方式來充分利用這些資質&#xff1a; 1. 租賃或轉讓資質&#xff1a; 將閑置的建筑資質租賃給其他企業或個人使用&#xff0c;或者通過轉讓的方式將資質出售給有需要的企業或個人。 2. 提供咨詢服務&#xff1a; 利用建…

git分布式版本控制系統(四)

目前世界上最先進的分布式版本控制系統 官方網址&#xff1a;https://git-scm.com 學習目標&#xff1a; 1 了解 git 前世今生 2 掌握 git 基礎概念、基礎操作 3 各種 git 問題處理 4 互聯網常用 gitflow(工作流程規范) 5 git 代碼提交規范 6 git 分支管理及命名規范 常見問…