數據結構(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;}
}

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

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

相關文章

最簡單的vue3組件之間傳值

localStorage 是 HTML5 引入的一個 Web Storage API 的一部分&#xff0c;它允許網頁在用戶的瀏覽器上存儲數據。localStorage 提供了一種持久化的本地存儲方案&#xff0c;數據不會因為瀏覽器關閉而丟失&#xff0c;除非用戶或腳本顯式地刪除它們。 localStorage 是一種非常實…

批量提取網頁表格內容至excel文件

問題背景 將網頁的表格內容&#xff08;5237個股票信息&#xff09;復制粘貼到excel文件中 網址&#xff1a;A股上市公司名單-A股上市公司名錄-A股上市公司大全-商業計劃書-可研報告-中商產業研究院數據庫-中商情報網 實現代碼 # 導入包 import pandas as pd import time# 創…

Android中為什么不直接activity調用到view,使用viewrootimpl去與底層溝通,而要追加一個phonewindow來管理呢?

在Android的架構設計中&#xff0c;Activity、PhoneWindow 和 ViewRootImpl 各自扮演著不同的角色&#xff0c;它們之間的協作是為了實現一個更加靈活、可擴展和易于管理的UI系統。不直接從Activity調用到View&#xff0c;而是引入PhoneWindow來管理&#xff0c;主要有以下幾個…

超越傳統:3D生物打印如何利用擴散創造奇跡?

超越傳統&#xff1a;3D生物打印如何利用擴散創造奇跡&#xff1f; 組織工程和再生醫學領域迫切需要能夠模擬人體組織結構和功能的體外模型和組織替代物。然而&#xff0c;傳統的體外模型和組織替代物往往難以滿足高度特異性、復雜性和功能性的要求。3D生物打印技術應運而生&a…

Base64文件流查看下載PDF方法-CSDN

問題描述 數票通等接口返回的PDF類型發票是以Base64文件流的方式返回的&#xff0c;無法直接查看預覽PDF發票&#xff0c; 處理方法 使用第三方在線工具&#xff1a;https://www.jyshare.com/front-end/61/ 在Html代碼框中粘貼如下代碼 <embed type"application/pd…

技術開發分享:商品詳情APP原數據實時接口代碼解析

商品詳情app端原數據實時接口代碼解析主要包括以下幾個步驟&#xff1a; 獲取商品ID&#xff1a;首先需要從淘寶的分享鏈接中提取商品ID&#xff0c;可以通過正則表達式匹配的方式獲取。 構建請求URL&#xff1a;根據商品ID構建請求URL&#xff0c;通常包括淘寶的商品詳情API地…

未來互聯網的新篇章:深度解析Web3技術

隨著技術的不斷演進&#xff0c;Web3正逐漸成為引領未來互聯網發展的關鍵驅動力。本文將深入探討Web3技術的核心概念、關鍵特征以及其對未來互聯網生態的深遠影響&#xff0c;旨在幫助讀者全面理解和把握這一新興技術的發展方向和潛力。 1. Web3的基本概念和演進 Web3并非簡單…

為什么鍵盤上F和J這兩個鍵有兩個凸起的橫線呢?

不知道小伙伴們有沒有注意過&#xff0c;我們常用的電腦鍵盤上&#xff0c;為什么F和J這兩個鍵總是有兩個凸起的橫線的呢&#xff1f; 首先&#xff0c;讓我們來回顧一下這位陪伴我們多年的老朋友——鍵盤。從最初的打字機到現在的機械鍵盤、薄膜鍵盤&#xff0c;鍵盤的形態和…

新書速覽|Vue.js 3.x+Express全棧開發:從0到1打造商城項目

《Vue.js 3.xExpress全棧開發&#xff1a;從0到1打造商城項目》 1 本書內容 《Vue.js 3.xExpress全棧開發 : 從0到1打造商城項目》是一本詳盡的全棧開發教程&#xff0c;旨在通過Vue.js和Express框架引導讀者從零開始構建一個完整的電商項目。內容覆蓋電商項目的基本結構&…

C++——map和set類用法指南

一、前言 1.1 關聯式容器 關聯式容器也是用來存儲數據的&#xff0c;與序列式容器不同的是&#xff0c;其里面存儲的是<key,value>結構的鍵值對&#xff0c;在數據檢索時比序列式容器效率更高。 1.2 鍵值對 用來表示具有一一對應關系的一種結構&#xff0c;該結構中一般…

編程入門題:畫矩形(C語言版)

1.題目描述&#xff1a; 根據輸入的四個參數:a,b,c,f參數&#xff0c;畫出對應的矩形。前兩個參數 a,b為整數&#xff0c;依次代表矩形的高和寬:第三個參數c是一個字符&#xff0c;表示用來填充的矩形符號第四個參數 f為整數&#xff0c;0 代表空心&#xff0c;否則代表實心。具…

Redis如何高效實現定時任務

寫在文章開頭 redis通過單線程結合非阻塞事件輪詢機制實現高效的網絡IO和時間事件處理&#xff0c;這篇文章我們將從源碼的角度深入分析一下redis時間事件的設計與實現。 Hi&#xff0c;我是 sharkChili &#xff0c;是個不斷在硬核技術上作死的 java coder &#xff0c;是 CS…

項目三層架構詳情

三層架構 三層架構就是為了符合“高內聚&#xff0c;低耦合”思想&#xff0c;把各個功能模塊劃分為表示層&#xff08;UI&#xff09;、業務邏輯層&#xff08;BLL&#xff09;和數據訪問層&#xff08;DAL&#xff09;三層架構&#xff0c;各層之間采用接口相互訪問&#xf…

(正向)代理 vs. 反向代理

&#xff08;正向&#xff09;代理 vs. 反向代理 代理和反向代理都是針對用戶而言的。 一、&#xff08;正向&#xff09;代理——代理客戶端 1. 流程 代理會隱藏客戶端的真實信息&#xff08;IP、端口&#xff09;&#xff0c;代替客戶端在互聯網上發起請求&#xff0c;并將…

09:C語言進階篇一

C語言進階篇一 數據類型1.1、內存占用與sizeof運算符1.2、有符號數和無符號數1.3、整形數和浮點型數存儲方式1.4、數據類型轉換1.4.1、隱式轉換1.4.2、強制轉換 數據類型 基本數據類型&#xff1a;char&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&…

什么是RLHF(基于人類反饋的強化學習)?

什么是RLHF&#xff08;基于人類反饋的強化學習&#xff09;&#xff1f; 基于人類反饋的強化學習&#xff08;Reinforcement Learning from Human Feedback, RLHF&#xff09;是一種結合強化學習和人類反饋的技術&#xff0c;用于訓練智能體&#xff0c;使其行為更符合人類期…

哪些類型的工作需要六西格瑪綠帶培訓?

一、六西格瑪綠帶是什么&#xff1f; 首先&#xff0c;讓我們來了解一下六西格瑪綠帶。六西格瑪綠帶是六西格瑪管理體系中的一個重要角色&#xff0c;他們通常負責在項目中執行六西格瑪方法和工具&#xff0c;協助黑帶完成復雜的項目任務。綠帶需要掌握基本的六西格瑪知識和技…

OpenJudge | 最高的分數

目錄 描述輸入輸出樣例輸入樣例輸出思路方法一方法二 CodeCC 總時間限制: 1000ms 內存限制: 65536kB 描述 孫老師講授的《計算概論》這門課期中考試剛剛結束&#xff0c;他想知道考試中取得的最高分數。因為人數比較多&#xff0c;他覺得這件事情交給計算機來做比較方便。你能…

蘿卜快跑:未來出行的雙刃劍

歡迎來到 破曉的歷程的 博客 ??不負時光&#xff0c;不負己?? 在這個日新月異的科技時代&#xff0c;無人駕駛技術正以前所未有的速度改變著我們的出行方式。蘿卜快跑&#xff0c;作為自動駕駛出租車領域的佼佼者&#xff0c;其出現無疑為城市交通注入了新的活力&#xff…

如何在在system_real_robot.launch修改訂閱的雷達

在 system_real_robot.launch 文件中修改訂閱的雷達,以使用開源 SLAM 包(如 FastLIO 和 TARE)輸出的優化后雷達話題。可以讓你的系統使用這些 SLAM 包提供的高精度雷達數據。 假設你的 Launch 文件中包括這一行: xml <param name="registeredScanTopic" ty…