數據結構(Java):力扣Stack集合OJ題

1、括號匹配問題

. - 力扣(LeetCode)

1.1 思路分析

根據棧的先進后出原則,我們可以這樣解決問題:

遍歷字符串,遇見左括號就將左括號push入棧;遇見右括號就pop出棧,將出棧的元素和該右括號比較是否匹配,若匹配則繼續遍歷并比較,若不匹配則直接返回false。細分為以下幾種情況:

1.匹配(左右括號數量相同且匹配):字符串遍歷完,且棧為空(右括號與左括號數量相等,且均匹配),則說明括號匹配,返回true。

2.不匹配(括號不匹配):遍歷到的右括號和出棧的左括號比較是否匹配,一旦不匹配,立即返回false。

3.不匹配(左括號數量多):當字符串遍歷完后,發現棧還不為空,則說明左括號多,不匹配。

4.不匹配(右括號多):遍歷遇見右括號需將棧頂的左括號出棧,若要出棧時棧為空,則說明右括號多,不匹配。

1.2 代碼

public boolean isValid(String s) {//利用棧先進后出特點 解決問題Stack<Character> stack = new Stack<>();//遍歷字符串for(int i = 0; i < s.length(); i++) {char ch = s.charAt(i);//若為左括號 將括號入棧if(ch == '(' || ch == '{' || ch == '[') {stack.push(ch);}else {//遍歷到的為右括號 進入else//若棧為空 則說明右括號多 立即返回falseif(stack.isEmpty()) {return false;}//若棧不為空 則pop出棧 比較是否匹配 char ch2 = stack.pop();switch(ch) {//使用switch語句比較是否匹配 一旦不匹配 立即返回falsecase ')':if(ch2 != '(') {return false;}break;case ']':if(ch2 != '[') {return false;}break;case '}':if(ch2 != '{') {return false;}break;}}}//遍歷完成且棧為空 則說明匹配 if(!stack.isEmpty()) {return false;}return true;}

2、棧的彈出、壓入序列

2.1 思路分析

以i遍歷pushV,每次都將將i下標的元素入棧,再將棧頂元素和j下標元素比較,
若相等:則出棧,j++,i++
不相等:則i++,j保持原位

注意:j++后,j下標與棧頂元素可能依然相等,此時要連續出棧。即j變化后,要繼續和棧頂元素比較。

  • i遍歷完成,且j也遍歷也完成(此時棧肯定為空),說明出棧序列匹配
  • 若i遍歷完成后,j還沒有遍歷完成(棧不為空),則說明出棧序列不匹配
    因為只有棧頂元素和j下標元素相等時,才會出棧,j++

?2.2 代碼

public boolean IsPopOrder (int[] pushV, int[] popV) {Stack<Integer> stack = new Stack<>();int j = 0;for (int i = 0; i < pushV.length; i++) {//每次循環都會將pushV中i下標的元素入棧stack.push(pushV[i]);//因為j++后,元素可能連續出棧,所以要while循環//出棧后,棧可能出現空的情況,!stack.isEmpty(),防止出現空指針異常while (!stack.isEmpty() && stack.peek() == popV[j]) {j++;//若j下標和棧頂元素相同,則出棧stack.pop();}}//i遍歷完成,若此時j也遍歷完成(j == popV.length),則說明出棧序列匹配return j == popV.length;}

3、逆波蘭表達式(后綴表達式)求值

. - 力扣(LeetCode)

3.1 逆波蘭表達式的定義

逆波蘭表達式,也稱為后綴表達式,是一種表達式的表示方法,其中運算符位于操作數之后。

后綴表達式由中綴表達式轉化而來,可以實現表達式的求值和計算,提高了計算機內存訪問的效率。而中綴表達式就是我們平時做運算的表達式。

那么如何將中綴表達式轉換為后綴表達式?

  1. 從左向右,以先乘除后加減的次序加括號
  2. 將括號中的相鄰兩項的運算符拿到括號的后面
  3. 去掉所有括號

?3.2 后綴表達式如何求值(思路分析)

我們拿到后綴表達式后,

  1. 遍歷表達式,若是非操作符元素(數字元素),則入棧
  2. 若遇到操作符元素,則出棧兩次,將第一次出棧的元素val2作為該操作符的右操作數,將第二次出棧的元素val1作為該操作符的左操作數,接著將所得結果入棧。
  3. 繼續遍歷,并重復以上操作
  4. 遍歷完成后,棧中只剩一個元素,該元素就是后綴表達式的值。

?3.3 代碼

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (int i = 0; i < tokens.length; i++) {String str = tokens[i];if (!isOperator(str)) {//如果不是是操作符//則元素入棧int val = Integer.parseInt(str);//將字符串轉化為整型stack.push(val);} else {//如果是操作符//則彈出棧頂兩個元素//計算結果,并將結果入棧int val2 = stack.pop();int val1 = stack.pop();if (str.equals("+")) {stack.push(val1 + val2);}if (str.equals("-")) {stack.push(val1 - val2);}if (str.equals("*")) {stack.push(val1 * val2);}if (str.equals("/")) {stack.push(val1 / val2);}}}//遍歷完成后,棧中還有一個元素//該元素就是后綴表達式的值return stack.pop();}//判斷該元素是否為操作符private boolean isOperator(String str) {if (str.equals("+") || str.equals("-")|| str.equals("*") || str.equals("/")) {return true;}return false;}
}

4、最小棧

. - 力扣(LeetCode)

4.1 思路分析

題目要求我們在O(1)內找到棧中的最小值,

而在Java已有的一個棧中我們只能通過遍歷找最小值,時間復雜度為為O(n)?。

所以,我們可以建立兩個棧,一個棧dataStack用來存儲元素,另一個棧minStack的棧頂存最小值。

  1. minStack棧頂存儲最小值數據 每次dataStack添加新數據時,和minStack棧頂元素比較,若<= ,則push入棧(一定要 <= ,因為dataStack中可能有多個相同的最小值,保證pop一次后,minStack依然存儲著最小值)
  2. 當minStack為空時,那么dataStack添加的元素(第一次入棧的元素)一定為最小值
  3. 當dataStack彈出元素時,我們需要判斷這個元素是否為minStack的棧頂元素(最小值),若是,也需要彈出minStack的元素

也就是說,?minStack的棧頂元素,就是dataStack的最小值。

4.2 代碼

class MinStack {Stack<Integer> dataStack;//存儲所有數據Stack<Integer> minStack;// 棧頂存儲最小值數據 每次添加新數據時,和minStack棧頂元素比較,若<= ,則push進minStackpublic MinStack() {dataStack = new Stack<>();minStack = new Stack<>();}public void push(int val) {dataStack.push(val);if (minStack.isEmpty()) {// 當minStack為空時,直接push進minStackminStack.push(val);} else {// 一定要有else 否則,minStack空時,同一個元素會在minStack中push兩次if (val <= minStack.peek()) {// 一定要 <= ,因為dataStack中可能有多個相同的最小值,保證pop一次,minStack依然存儲著最小值minStack.push(val);}}}public void pop() {// 操作總是在 非空棧 上調用int val = dataStack.pop();// 當dataStack棧頂元素為最小值時,也要彈出minStack的棧頂元素if (val == minStack.peek()) {minStack.pop();}}public int top() {return dataStack.peek();}public int getMin() {// minStack的棧頂元素即為最小值return minStack.peek();}
}

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

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

相關文章

pyparsing開啟調試

在要匹配的表達后添加set_debug

【密碼學】實現消息認證或數字簽名的幾種方式

消息認證的目的是驗證消息的完整性和確認消息的來源。數字簽名的目的是不僅驗證消息的完整性和來源&#xff0c;還提供了不可否認性。此外&#xff0c;數字簽名還可以驗證消息的創建時間&#xff0c;防止重放攻擊。那么具體有哪些實現的方式呢&#xff1f; 一、僅提供消息認證…

python練習(if--else)

通過input語句獲取鍵盤輸入的身高 判斷身高是否超過120cm&#xff0c;并通過print給出提示信息。 代碼輸出示例&#xff1a; 1.歡迎來到樂園。 請輸入你的身高&#xff08;cm&#xff09;&#xff1a;130 您的身高超出120cm&#xff0c;游玩需要夠票10元。 祝您游玩愉快。 2…

文件內容查閱

cat concatenate files and print on the standard output Linux中一個最簡單的且最常用的命令是cat命令。其功能是在終端設備上顯示文件內容。 cat命令-n選項用于顯示行號。 tac concatenate and print files in reverse tac命令的功能是用于反向顯示文件內容&#xff0c;即…

計算機網絡復習筆記【面向考綱整理】

計算機網絡復習筆記 一、計算機網絡體系結構&#xff08;一&#xff09;計算機網絡的概念、分類、組成與功能1.計算機網絡的概念、組成與功能1.1計算機網絡的概念1.2計算機網絡的組成1.3計算機網絡的功能 2.計算機網絡的分類3.計算機網絡的標準化工作及相關知識 &#xff08;二…

MT6816磁編碼IC在工控機器人中的應用

在現代工業自動化領域&#xff0c;高精度的位置檢測和控制技術對于機器人系統的穩定運行至關重要。MT6816磁編碼IC作為一款先進的磁傳感器解決方案&#xff0c;以其卓越的性能和穩定性&#xff0c;在工控機器人中得到了廣泛的應用。本文將詳細探討MT6816磁編碼IC在工控機器人中…

azure學習在日本IT工作的重要性

在日本數字化轉型的浪潮中,微軟Azure已經成為眾多企業的首選云平臺。作為全球第二大云服務提供商,Azure在日本市場的重要性與日俱增。本文將探討為什么學習Azure對日本IT專業人士至關重要,以及如何通過lalapodo云原生技術的培訓課程,快速掌握這一關鍵技能。 Azure在日本的戰略地…

血液及造血系統疾病病人的護理

一、血液及造血系統疾病病人的基礎護理 對于患有血液及造血系統疾病的病人&#xff0c;護理工作的重點首先在于密切監測生命體征&#xff0c;包括體溫、心率、呼吸頻率和血壓。 飲食護理也十分關鍵&#xff0c;要保證病人攝入充足的營養&#xff0c;以增強抵抗力。例如&#xf…

【Django+Vue3 線上教育平臺項目實戰】構建高效線上教育平臺之首頁模塊

文章目錄 前言一、導航功能實現a.效果圖&#xff1a;b.后端代碼c.前端代碼 二、輪播圖功能實現a.效果圖b.后端代碼c.前端代碼 三、標簽欄功能實現a.效果圖b.后端代碼c.前端代碼 四、側邊欄功能實現1.整體效果圖2.側邊欄功能實現a.效果圖b.后端代碼c.前端代碼 3.側邊欄展示分類及…

element UI時間組件兩種使用方式

加油&#xff0c;新時代打工&#xff01; 組件官網&#xff1a;https://element.eleme.cn/#/zh-CN/component/date-picker 先上效果圖&#xff0c;如下&#xff1a; 第一種實現方式 <div class"app-container"><el-formref"submitForm":model&q…

Linux C++ 052-設計模式之享元模式

Linux C 052-設計模式之享元模式 本節關鍵字&#xff1a;Linux、C、設計模式、享元模式 相關庫函數&#xff1a; 概念 享元模式&#xff08;FlyWeight&#xff09;&#xff0c;運用共享技術有效的支持大量細粒度的對象。 典型的享元模式的例子為文書處理器中以圖形結構來表…

探索 Prompt 的世界:讓你的 AI 更智能

探索 Prompt 的世界&#xff1a;讓你的 AI 更智能 引言什么是 Prompt&#xff1f;Prompt 的重要性如何編寫有效的 Prompt1. 清晰明確2. 包含關鍵細節3. 提供上下文 實踐中的 Prompt 技巧1. 多次迭代2. 實驗不同風格3. 結合實際應用 總結 引言 隨著人工智能&#xff08;AI&…

數據恢復篇:適用于 Android 的恢復工具

正在擺弄 Android 設備。突然&#xff0c;您意外刪除了一張或多張圖片。不用擔心&#xff0c;您總能找到一款價格實惠的照片恢復應用。這款先進的軟件可幫助 Android 用戶從硬盤、安全數字 (SD) 或存儲卡以及數碼相機中恢復已刪除的圖片。 Android 上文件被刪除的主要原因 在獲…

采用自動微分進行模型的訓練

自動微分訓練模型 簡單代碼實現&#xff1a; import torch import torch.nn as nn import torch.optim as optim# 定義一個簡單的線性回歸模型 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear nn.Linear(1, 1) …

【Linux】數據流重定向

數據流重定向&#xff08;redirect&#xff09;由字面上的意思來看&#xff0c;好像就是將【數據給它定向到其他地方去】的樣子&#xff1f; 沒錯&#xff0c;數據流重定向就是將某個命令執行后應該要出現在屏幕上的數據&#xff0c;給它傳輸到其他的地方&#xff0c;例如文件或…

[圖解]企業應用架構模式2024新譯本講解26-層超類型2

1 00:00:00,510 --> 00:00:03,030 這個時候&#xff0c;如果再次查找所有人員 2 00:00:03,040 --> 00:00:03,750 我們會發現 3 00:00:05,010 --> 00:00:06,370 這一次所有的對象 4 00:00:06,740 --> 00:00:08,690 都是來自標識映射的 5 00:00:10,540 --> 00…

VB 上位機開發

VB 上位機開發第一節 在 VB(Visual Basic)上位機開發的第一節課程中涵蓋以下基礎內容: 一、上位機開發簡介 解釋上位機的概念和作用,它是與硬件設備進行通信和控制的軟件應用程序。舉例說明上位機在工業自動化、智能家居、監控系統等領域的應用。二、VB 開發環境介紹 展示如…

2024遼寧省數學建模C題【改性生物碳對水中洛克沙胂和砷離子的吸附】原創論文分享

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2024 年遼寧省大學數學建模競賽C題改性生物碳對水中洛克沙胂和砷離子的吸附完整的成品論文。 本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃…

Rubber Duck Debugging: History and Benefits 橡皮鴨調試:歷史和優勢

注&#xff1a;機翻&#xff0c;未校對。 Discover the origins of rubber duck debugging, why it works, and why it has become so popular among programmers. 了解橡皮鴨調試的起源&#xff0c;它為什么有效&#xff0c;以及為什么它在程序員中如此受歡迎。 Debugging co…

AMD CPU加 vega 顯卡運行ollama本地大模型

顯卡是VEGA56&#xff0c;這個卡代號是gfx900 雖然ollama頁面上寫著這個卡可以&#xff0c;但是實際是不可以的 報錯如下&#xff1a; levelWARN sourceamd_windows.go:97 msg"amdgpu is not supported" gpu0 gpu_typegfx900:xnack 它認為的GPU型號是 gfx900:xna…