棧和隊列相關知識題目

棧的底層原理

棧(Stack)是一種后進先出(LIFO)?的線性數據結構,所有操作(如插入、刪除)僅在棧頂進行。它的底層實現可以是數組或鏈表,具體取決于編程語言和應用場景。

1.基于數組實現:使用連續內存的數組存儲元素,通過一個指針(如?top)標記棧頂位置。

核心操作:入棧(Push)?:將元素放入?top?位置,top?指針后移。?

出棧(Pop)?:返回?top-1?位置的元素,top?指針前移。

2. 基于鏈表(鏈式存儲):使用單向鏈表(頭插法)存儲元素,鏈表的頭節點作為棧頂。

入棧(Push)?:將新節點插入鏈表頭部。

?出棧(Pop)?:刪除鏈表頭節點并返回其值。

棧的應用場景

函數調用與遞歸:操作系統自動管理函數調用棧。
?括號匹配:檢查表達式中的括號是否成對。
?表達式求值:中綴表達式轉后綴表達式(逆波蘭式)。
?撤銷操作(Undo)?:編輯器中的操作歷史棧。
?深度優先搜索(DFS)?:用棧保存遍歷路徑

對應題目?

用棧實現隊列用棧實現隊列用棧實現隊列

思想:用兩個棧來模擬隊列,由于隊列是先進先出,所以設置兩個棧,一個入隊棧,一個出隊棧

import java.util.Deque;
import java.util.ArrayDeque;class MyQueue {private Deque<Integer> inputStack;private Deque<Integer> outputStack;public MyQueue() {inputStack = new ArrayDeque<>();outputStack = new ArrayDeque<>();}// 入隊:直接壓入輸入棧public void push(int x) {inputStack.push(x);}// 出隊:若輸出棧為空,先轉移元素public int pop() {if (outputStack.isEmpty()) {transferInputToOutput();}return outputStack.pop();}// 查看隊首元素:類似出隊但不刪除public int peek() {if (outputStack.isEmpty()) {transferInputToOutput();}return outputStack.peek();}// 判斷隊列是否為空public boolean empty() {return inputStack.isEmpty() && outputStack.isEmpty();}// 將輸入棧元素轉移到輸出棧(反轉順序)private void transferInputToOutput() {while (!inputStack.isEmpty()) {outputStack.push(inputStack.pop());}}
}

用隊列實現棧用隊列實現棧用隊列實現棧用隊列實現棧

思想:隊列模擬棧,使用兩個隊列來模擬,一個主隊列,一個副隊列

核心思想
  • 維護兩個隊列:一個主隊列(mainQueue)和一個輔助隊列(tempQueue)。
  • ?入棧(Push)?:直接將元素加入主隊列。
  • ?出棧(Pop)?:將主隊列中除最后一個元素外的所有元素轉移到輔助隊列,彈出最后一個元素,最后交換主隊列和輔助隊列的角色。
?操作步驟
  1. ?Push(入棧)?
    • 將新元素直接加入主隊列。
  2. ?Pop(出棧)?
    • 將主隊列中的前?n-1?個元素依次出隊并加入輔助隊列。
    • 彈出主隊列的最后一個元素(即棧頂元素)。
    • 交換主隊列和輔助隊列的角色,以便下次操作。
    • import java.util.LinkedList;
      import java.util.Queue;class MyStack {private Queue<Integer> mainQueue;private Queue<Integer> tempQueue;public MyStack() {mainQueue = new LinkedList<>();tempQueue = new LinkedList<>();}// 入棧:直接加入主隊列public void push(int x) {mainQueue.offer(x);}// 出棧:轉移前n-1個元素后彈出最后一個元素public int pop() {while (mainQueue.size() > 1) {tempQueue.offer(mainQueue.poll());}int top = mainQueue.poll();// 交換主隊列和輔助隊列Queue<Integer> swap = mainQueue;mainQueue = tempQueue;tempQueue = swap;return top;}// 查看棧頂元素:邏輯同pop,但需將元素重新放回主隊列public int top() {while (mainQueue.size() > 1) {tempQueue.offer(mainQueue.poll());}int top = mainQueue.poll();tempQueue.offer(top); // 重新加入隊列// 交換隊列Queue<Integer> swap = mainQueue;mainQueue = tempQueue;tempQueue = swap;return top;}// 判空:主隊列是否為空public boolean empty() {return mainQueue.isEmpty();}
      }

有效的括號有效的括號

思想:括號匹配是使用棧解決的經典問題。遇見左括號就壓入棧中,遇見右括號,先判斷棧是否為空,在導出棧頂元素判斷,若最后棧為空則說明符號匹配成功,若左右括號不匹配也返回失敗。

class Solution {public boolean isValid(String s) {Stack<Character> stack =new Stack<>();for (int i=0;i<s.length();i++){char c1 = s.charAt(i);if(c1 =='{' ||c1 =='(' ||c1 =='['){stack.push(c1);}else if(c1 =='}' ||c1 ==')' ||c1 ==']'){if(stack.isEmpty()){return false;}else if (stack.peek() =='{' && c1 =='}'){stack.pop();}else if (stack.peek() =='(' && c1 ==')'){stack.pop();}else if (stack.peek() =='[' && c1 ==']'){stack.pop();}else{return false;}}}return stack.isEmpty();}
}

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

思想:比較簡單,需要注意一個點就是,棧無法直接轉化成數組,即stack.toString()是錯誤的
要創建數組,將棧中的元素都出棧即可

class Solution {public String removeDuplicates(String s) {Stack<Character> stack =new Stack<>();for(int i=0;i<s.length();i++){char c = s.charAt(i);if(stack.isEmpty() || c != stack.peek()){stack.push(c);}else {stack.pop();}}String str = "";//剩余的元素即為不重復的元素while (!stack.isEmpty()) {str = s.pop() + str;}return str;}
}

逆波蘭表達式求值

要注意下述代碼中的幾個問題:
1.因為字符串表示的是整數的加減乘除運算,所以定義棧的時候要采取整型Stack<Integer> stack =new Stack<>();
2.定義兩個變量分別存儲前兩個操作數,但要注意操作數的順序,因為先進后出,所以第一個出來的是第二個操作數
3.巧用switch分支結構,先做判斷,在壓入棧
4.最后不是輸出整個棧的元素,方法要求的返回表達式值的整數,所以要做類型轉換Integer.valueOf(token)

5.由于leetcode 內置jdk的問題,不能使用==判斷字符串是否相等,只能用equals。并且字符相等用雙引號

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack =new Stack<>();int a,b,c;for(String token :tokens){if(token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/") ){b = stack.pop();//第二個操作數a = stack.pop();//第一個操作數c = switch(token){case "+" -> a+b;case "-" -> a-b;case "*" -> a*b;case "/" -> a/b;default ->  0;};stack.push(c);}else {stack.push(Integer.valueOf(token));}}return stack.pop();}
}

有效的括號用隊列實現棧用隊列實現棧用隊列實現棧

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

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

相關文章

【實戰案例】永洪vividime:精準賦能零售行業,實現數據洞察與業務增長

在零售食品行業變革加速、市場競爭白熱化的背景下&#xff0c;XX集團作為休閑食品領域頭部企業&#xff0c;面臨消費趨勢變化、宏觀經濟承壓及業績增長乏力的多重挑戰。為破解增長困境&#xff0c;集團將“收入增長金額”確立為核心戰略指標&#xff08;北極星指標&#xff09;…

一些題目記錄

別人面經題目記錄 https://zhuanlan.zhihu.com/p/32626732052 實現 NMS&#xff0c;七八次&#xff0c;很高頻&#xff1b; 實現 MultiHeadSelfAttention&#xff0c;大概 三四次&#xff1b; 用 Numpy 或者 List 實現MLP 的前向和反向&#xff0c;4次&#xff1b; Leetcode …

面試題分享-多線程順序打印奇偶數

目錄 1.題目詳情 2.解題思路 2.1.分析題目 2.2.解析思路 3.代碼實現 4.運行結果 1.題目詳情 昨天刷抖音&#xff0c;遇到一個面試題&#xff0c;描述如下&#xff1a; 請使用兩個線程&#xff0c;分別順序交替打印奇數和偶數&#xff0c;直到10為止。例如有兩個線程&#…

模型 杜根定律

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思維模型目錄。信心>能力、行動導向、未來時態。 1 杜根定律的應用 1.1 公共政策博弈——底特律市長杜根的保險改革攻堅戰 核心挑戰&#xff1a;底特律市長Mike Duggan面臨汽車保險費率畸高導致居民陷入貧困循環的…

關于在vscode中的Linux 0.11 應用程序項目的生成和運行

首先我們需要需要查看鏡像文件 查看軟盤鏡像文件 floppyb.img 中的內容 在 VSCode 的“Terminal”菜單中選擇“Run Build Task...”&#xff0c;會在 VSCode 的頂部中間位置彈出一個 可以執行的 Task 列表&#xff0c;選擇其中的“打開 floppyb.img”后會使用 Floppy Editor …

使用CSS3實現炫酷的3D視差滾動效果

使用CSS3實現炫酷的3D視差滾動效果 這里寫目錄標題 使用CSS3實現炫酷的3D視差滾動效果項目概述核心技術實現1. 3D空間的創建2. 視差層級設置3. 動畫效果實現流星動畫月亮發光效果 技術難點與解決方案1. 層級重疊問題2. 性能優化3. 響應式適配 開發心得總結 項目概述 在這個項目…

作業12 (2023-05-15 指針概念)

第1題/共11題【單選題】 關于指針的概念,錯誤的是:( ) A.指針變量是用來存放地址的變量 B.指針變量中存的有效地址可以唯一指向內存中的一塊區域 C.野指針也可以正常使用 D.局部指針變量不初始化就是野指針 回答正確 答案解析: A:正確,指針變量中存儲的是一個地址,指…

【ESP32S3】esp32獲取串口數據并通過http上傳到前端

通過前面的學習&#xff08;前面沒發過&#xff0c;因為其實就是跑它的demo&#xff09;了解到串口配置以及開啟線程實現功能的工作流程&#xff0c;與此同時還有esp32作為STA節點&#xff0c;將數據通過http發送到服務器。 將這兩者聯合 其實是可以得到一個&#xff1a;esp32獲…

《鴻蒙攜手AI:解鎖智慧出行底層邏輯》

在科技飛速發展的當下&#xff0c;智慧出行成為人們對未來交通的美好期許&#xff0c;而鴻蒙系統與人工智能的深度融合&#xff0c;正為這一愿景的實現提供強大助力。從技術原理角度深入剖析&#xff0c;鴻蒙系統究竟如何支撐人工智能在智慧出行場景中的應用呢&#xff1f;這背…

MyBatis-Plus緩存機制深度解析與SpringBoot整合實戰

一、MyBatis-Plus緩存機制全景解析 MyBatis-Plus在MyBatis原生緩存基礎上進行了深度增強,形成了多層次的緩存體系: 1. 緩存層級架構 應用層 ├── MP擴展緩存(多租戶/邏輯刪除) ├── 二級緩存(Mapper級別,跨Session共享) └── 一級緩存(SqlSession級別,默認開…

Day38 | 1365. 有多少小于當前數字的數字、941. 有效的山脈數組、1207. 獨一無二的出現次數、283. 移動零、189. 輪轉數組

1365. 有多少小于當前數字的數字 題目鏈接&#xff1a;1365. 有多少小、于當前數字的數字 - 力扣&#xff08;LeetCode&#xff09; 題目難度&#xff1a;簡單 代碼&#xff1a; class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {Map<Integer,Inte…

數據人的進階之路:四年數倉實踐與成長思考

前言 在數據倉庫開發的過程中&#xff0c;常常會遇到很多值得思考的問題&#xff0c;它們不僅關乎技術的深度&#xff0c;也涉及業務理解、個人的成長&#xff0c;甚至是數據行業未來的價值。回顧過去的經歷&#xff0c;有很多問題反復出現&#xff0c;甚至成為繞不開的課題&am…

大文件分片上傳及斷點續傳實現

使用 支持分片上傳及斷點續傳 前端使用 vue 2 后端使用 springboot 源碼在私信

圖解AUTOSAR_SWS_IOHardwareAbstraction

AUTOSAR IO硬件抽象層詳解 基于AUTOSAR標準的IO硬件抽象層設計與實現指南 目錄 1. 概述2. 架構設計 2.1 模塊架構概覽2.2 內部組件結構2.3 與其他模塊的交互接口 3. 狀態機 3.1 狀態定義3.2 狀態轉換3.3 狀態行為 4. ADC信號處理流程 4.1 初始化流程4.2 轉換請求和處理4.3 通知…

Python正則表達式(一)

目錄 一、正則表達式的基本概念 1、基本概念 2、正則表達式的特殊字符 二、范圍符號和量詞 1、范圍符號 2、匹配漢字 3、量詞 三、正則表達式函數 1、使用正則表達式&#xff1a; 2、re.match()函數 3、re.search()函數 4、findall()函數 5、re.finditer()函數 6…

北京交通大學第三屆C語言積分賽

作者有言在先&#xff1a; 題解的作用是交流思路&#xff0c;不是抄作業的。可以把重點放在思路分析上而不是代碼上&#xff0c;畢竟每個人的代碼風格是不一樣的&#xff0c;看別人的代碼就跟做程序填空題一樣。先看明白思路再看代碼。 還有就是&#xff0c;deepseek真的很好用…

機器學習之條件概率

1. 引言 概率模型在機器學習中廣泛應用于數據分析、模式識別和推理任務。本文將調研幾種重要的概率模型,包括EM算法、MCMC、樸素貝葉斯、貝葉斯網絡、概率圖模型(CRF、HMM)以及最大熵模型,介紹其基本原理、算法流程、應用場景及優勢。 2. EM算法(Expectation-Maximizati…

硬件基礎--03_電流

電流 十九世紀初:[電流方向]是指正電荷的移動方向。 后來:對于金屬導體&#xff0c;正電荷沒移動&#xff0c;其實是電子在移動。 為了定義的統一性[電流方向]仍然定義為正電荷的移動方向 所以:[電流方向]與[電子移動方向]是相反的。 概念:電荷的定向移動&#xff0c;形成了電…

multi paxos協議

1. Redo Log 同步的核心目標 ?數據一致性&#xff1a;確保所有副本在事務提交后具有相同的數據視圖。?容錯性&#xff1a;在主副本故障時&#xff0c;從副本能快速接管并恢復數據。?高吞吐&#xff1a;通過批量同步和并行處理提升效率。 2. Multi Paxos 協議的同步流程 M…

借壹起航東風,中國工廠出海開啟新征程

在經濟全球化不斷深入的當下&#xff0c;中國工廠正以積極的姿態投身海外市場&#xff0c;渴望在全球商業版圖中占據一席之地&#xff0c;綻放獨特的光彩。然而&#xff0c;出海之路充滿了挑戰與艱辛&#xff0c;品牌塑造困難重重、詢盤量不穩定、營銷成本居高不下等問題&#…