[數據結構] 棧 · Stack

一.棧 · stack

1.概念

:

  • 一種特殊的線性表 , 其只允許再固定的一段進行插入和刪除元素操作?
  • 進行數據插入和刪除操作的一段稱為 棧頂? ; 另一端稱為棧底
  • 棧中的數據元素遵循 先進后出 原則(LIFO)
  • 壓棧 : 棧的插入操作叫做 進棧壓棧入棧 , 入數據在棧頂
  • 出棧 : 棧的刪除操作叫做 出棧 , 出數據在棧頂

2.棧的主要方法

方法功能
Stack()構造一個空的棧
E push(E e)將 e 入棧,并返回 e
E pop()將棧頂元素出棧并返回
E peek()獲取棧頂元素
int size()獲取棧中有效元素個數
boolean empty()檢測棧是否為空
    public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(11);stack.push(12);stack.push(13);stack.push(14);System.out.println(stack);System.out.println(stack.size());System.out.println(stack.peek());stack.pop();}

3.棧的模擬實現

Stack 繼承了 Vector(動態順序表)

import java.util.Arrays;public class MyStack {public int[] elem;public int usedSize;public MyStack(){this.elem = new int[10];}public boolean isFull(){return this.elem.length == usedSize;}//將 元素 val 入棧 , 并返回public void push(int val){if(isFull()){//判滿this.elem = Arrays.copyOf(elem,elem.length*2);//滿了則擴大為原來的兩倍}this.elem[usedSize++] = val;//后置++ , 先使用usedSize , 再+1}public boolean empty(){return usedSize == 0;//判斷是否為空 , 空返回true , 非空返回false}public int pop(){//將棧頂元素取出 , 并返回if(empty()){throw new EmptyStackException();}else{int val = elem[usedSize-1];usedSize--;return val;}}public int peek(){//獲取棧頂元素if(empty()){throw new EmptyStackException();}else{return elem[usedSize];}}}
public class EmptyStackException extends RuntimeException{public EmptyStackException() {super();}public EmptyStackException(String message) {super(message);}
}
  • 測試:
public class Test {public static void main(String[] args) {MyStack myStack = new MyStack();myStack.push(11);myStack.push(12);myStack.push(13);myStack.push(14);System.out.println(myStack);//打印棧的元素System.out.println(myStack.pop());//打印棧頂的元素 , 并將棧頂元素取出System.out.println(myStack);System.out.println(myStack.peek());//打印棧頂的元素}
}

4.棧的應用場景

①改變元素序列

②將遞歸化為循環

// 遞歸方式
void printList(Node head) {if (null != head) {printList(head.next);System.out.print(head.val + " ");}
}// 循環方式
void printList(Node head) {if (null == head) {return;}Stack<Node> s = new Stack<>();// 將鏈表中的結點保存在棧中Node cur = head;while (null != cur) {s.push(cur);cur = cur.next;}// 將棧中的元素出棧while (!s.empty()) {System.out.print(s.pop().val + " ");}
}

括號匹配問題

題目:

  • 給定一個只包括?'('')''{''}''['']'?的字符串?s?,判斷字符串是否有效。
  • 有效字符串需滿足:
  • 左括號必須用相同類型的右括號閉合。
  • 左括號必須以正確的順序閉合。
  • 每個右括號都有一個對應的相同類型的左括號
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(stack.empty()){return false;}char c2 = stack.peek();if(c1 == ')' && c2 == '('|| c1 == '}' && c2 == '{'|| c1 == ']' && c2 == '['){stack.pop();}else {return false;}}}if(!stack.empty()){return false;}return true;}

④棧的壓入、彈出序列

題目:

  • 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序
  • 假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
  • 0<=pushV.length ==?popV.length <=1000
  • ?-1000<=pushV[i]<=1000
  • ?pushV?的所有數字均不相同
        public boolean IsPopOrder (int[] pushV, int[] popV) {Stack <Integer> stack = new Stack<>();int j = 0;for (int i = 0; i < pushV.length; i++) {stack.push(pushV[i]);while(!stack.empty()&&j < popV.length&&stack.peek() == popV[j]){stack.pop();j++;}}return stack.empty() ;}

⑤逆波蘭表達式求值

  • 中綴表達式求值

逆波蘭表達式求值:

  • 將這些字符從左到右依次放到棧中
  • 其中數字放到棧中 , 遇到算數符號時 , 取出兩個棧頂的元素
  • 其中最上方的元素作為運算符的左操作數,下一個元素作為右操作數 , 再把得到的結果放回棧中
  • 繼續重復操作

題目:

給你一個字符串數組?tokens?,表示一個根據?逆波蘭表示法?表示的算術表達式。

請你計算該表達式。返回一個表示表達式值的整數。

注意:

  • 有效的算符為?'+''-''*'?和?'/'?。
  • 每個操作數(運算對象)都可以是一個整數或者另一個表達式。
  • 兩個整數之間的除法總是?向零截斷?。
  • 表達式中不含除零運算。
  • 輸入是一個根據逆波蘭表示法表示的算術表達式。
  • 答案及所有中間計算結果可以用?32 位?整數表示。
public boolean isoperation(String s){if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}else {return false;}}public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>() ;for (String c:tokens) {if(!isoperation(c)){int x = Integer.parseInt(c);stack.push(x);}else {int val2 = stack.pop();int val1 = stack.pop();switch (c){case "+":stack.push(val1+val2);break;case "-":stack.push(val1-val2);break;case "*":stack.push(val1*val2);break;case "/":stack.push(val1/val2);break;}}}return stack.pop();}

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

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

相關文章

MySQL執行過程中如何選擇最佳的執行路徑

本篇文章介紹一個非常核心的數據庫問題。MySQL 選擇最佳執行路徑&#xff08;即“查詢優化”&#xff09;的過程是由其查詢優化器&#xff08;Query Optimizer&#xff09; 完成的。 簡單來說&#xff0c;優化器的目標是&#xff1a;在多種可能的執行方案中&#xff0c;選擇一個…

【設計模式】從游戲角度開始了解設計模式 --- 抽象工廠模式

永遠記住&#xff0c;你的存在是有意義的&#xff0c; 你很重要&#xff0c; 你是被愛著的&#xff0c; 而且你為這個世界帶來了無可取代的東西。 -- 麥克西 《男孩、鼴鼠、狐貍和馬》-- 從零開始了解設計模式抽象工廠模式抽象工廠模式 今天我們一起來探究抽象工廠模式&#x…

tensorflow.js 使用場景

TensorFlow.js (簡稱 TF.js) 是一個利用 WebGL 和 Node.js 在瀏覽器和服務器端進行機器學習模型訓練和部署(推理)的 JavaScript 庫。它的核心價值在于將機器學習的能力帶入了 Web 開發者和 JavaScript 生態的領域。 其主要應用場景可以分為以下幾大類: 一、在瀏覽器中直接進…

詳解mcp以及agen架構設計與實現

文章目錄1.MCP概念2.MCP服務端主要能力3.MCP技術生態4.MCP與Function call區別5.MCP生命周期6.MCP java SDK7.MCP應用場景8.基于springAIollma阿里qianwenmcp設計私有AIAgent應用實現9.AI java項目落地技術選型10.構建AI Agent四大模塊11.LLM(大模型)與MCP之間關系12.A2A、MCP、…

六級第一關——下樓梯

上目錄&#xff1a; 目錄 題目描述 輸入格式 輸出格式 輸入輸出樣例 說明/提示 一、DP的意義以及線性動規簡介 在一個困難的嵌套決策鏈中&#xff0c;決策出最優解。 二、動態規劃性質淺談 三、子序列問題 &#xff08;一&#xff09;一個序列中的最長上升子序列&am…

【Linux基礎】Linux系統配置IP詳解:從入門到精通

目錄 1 Linux網絡配置概述 2 網卡配置文件位置和命名規則 2.1 配置文件位置 2.2 網卡命名規則 2.3 配置文件命名示例 3 網卡配置文件詳解 3.1 主要參數說明 4 Linux系統配置IP步驟 4.1 DHCP動態配置 4.2 靜態IP配置 5 Linux網絡配置流程 5.1 網絡配置流程 5.2 網卡…

C語言sprintf的高效替代方案

C語言的sprintf和snprintf將變量格式化輸出到內存buffer&#xff0c;其功能強大&#xff0c;用起來很方便。但sprintf系列函數的運行效率低下&#xff0c;主要包括四方面的原因&#xff1a;格式字符串解析、變參處理、locale&#xff08;本地化&#xff09;支持和通用&#xff…

【知識堂】制造業與物流數字化全景圖:系統縮寫大全與專業名詞速查手冊

前言在制造業和物流行業的數字化轉型過程中&#xff0c;我們經常會接觸到大量的 系統縮寫&#xff08;如 ERP、MES、WMS…&#xff09;和 專業名詞&#xff08;如 AGV、BOM、LOT…&#xff09;。 這些縮寫往往讓剛入行的人“一頭霧水”&#xff0c;即使是有經驗的從業者&#x…

利用JSONCrack與cpolar提升數據可視化及跨團隊協作效率

文章目錄前言1. 在Linux上使用Docker安裝JSONCrack2. 安裝Cpolar內網穿透工具3. 配置JSON Crack界面公網地址4. 遠程訪問 JSONCrack 界面5. 固定 JSONCrack公網地址前言 JSONCrack 是一款功能強大的開源數據可視化工具&#xff0c;專為解析和展示復雜的 JSON、XML 等結構化數據…

CANoe入門之一 CANoe功能概述

01 CANoe功能概述 CANoe軟件在汽車電子領域被廣泛應用。 CANoe軟件的全稱是CAN Open Environment&#xff0c;它是一個專業的系統級總線和ECU仿真、分析、開發、測試工具。支持ECU或總線網絡開發從需求分析到系統實現的全過程&#xff0c;包括模型創建、仿真、測試、診斷及通信…

項目管理核心八項(軟件篇)

2025年09月11日23:50:33&#xff1a;進來常思&#xff0c;寫代碼也五六年了&#xff0c;后面的路該何去何從呢&#xff1f; 項目管理核心八項一、項目管理之“建立開發人員 backup 機制”二、待補充一、項目管理之“建立開發人員 backup 機制” “建立開發人員 backup 機制” 是…

springboot redisson 分布式鎖入門與實戰

Spring Boot3 Redisson 項目地址 https://gitee.com/supervol/loong-springboot-study &#xff08;記得給個start&#xff0c;感謝&#xff09; Redisson 介紹 在分布式系統中&#xff0c;多節點部署的應用對共享資源&#xff08;如數據庫記錄、緩存鍵、文件&#xff09;的…

使用 Tkinter + Requests 實現地理信息安全系統學習時長助手

?重磅&#xff01;盹貓的個人小站正式上線啦&#xff5e;誠邀各位技術大佬前來探秘&#xff01;? 這里有&#xff1a; 硬核技術干貨&#xff1a;編程技巧、開發經驗、踩坑指南&#xff0c;帶你解鎖技術新姿勢&#xff01;趣味開發日常&#xff1a;代碼背后的腦洞故事、工具…

構建一個優雅的待辦事項應用:現代JavaScript實踐

構建一個優雅的待辦事項應用&#xff1a;現代JavaScript實踐本文將介紹如何使用現代JavaScript&#xff08;ES6&#xff09;和DOM操作創建一個功能完整的待辦事項應用&#xff0c;無需任何外部庫或框架。功能概述添加新任務標記任務為完成/未完成編輯任務內容刪除任務過濾任務&…

【數據可視化-111】93大閱兵后的軍費開支情況———2024年全球軍費開支分析:用Python和Pyecharts打造炫酷可視化大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

3.2.Maven-概述-介紹安裝

一.介紹&#xff1a;二.安裝&#xff1a;Maven的安裝比較簡單&#xff0c;因為他是綠色版的軟件&#xff0c;官方給我們提供Maven的安裝包就是一個zip壓縮包&#xff0c;在進行Maven安裝以及配置的時候&#xff0c;主要進行如下4步操作&#xff1a;第一步&#xff1a;把官方提供…

Kafka面試精講 Day 14:集群擴容與數據遷移

【Kafka面試精講 Day 14】集群擴容與數據遷移 在“Kafka面試精講”系列的第14天&#xff0c;我們將深入探討 Kafka 運維中最關鍵的操作之一&#xff1a;集群擴容與數據遷移。隨著業務增長&#xff0c;原始 Kafka 集群可能面臨磁盤不足、吞吐瓶頸或節點負載不均等問題&#xff…

字節一面 面經(補充版)

什么是RabbitMQ&#xff0c;特點是什么怎么理解保障消息的一致性String、StringBuffer、StringBuilder解釋一下線程安全先操作數據庫再刪緩存還是先刪緩存再操作數據庫這種辦法能杜絕數據不一致問題嗎解釋一下AOP介紹Redis的特點&#xff08;Redis比較快&#xff09;Redis為什么…

【MFC】對話框屬性:Absolute Align(絕對對齊)

前言 本文介紹對話框屬性中的Absolute Align(絕對對齊)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&…

【從0開始學習Java | 第17篇】集合(中-Set部分)

文章目錄Java集合之Set&#xff1a;無序不重復的元素容器一、Set接口的核心特性二、常用實現類及底層原理1. HashSet&#xff1a;基于哈希表的高效實現2. LinkedHashSet&#xff1a;保留插入順序的哈希實現3. TreeSet&#xff1a;基于紅黑樹的排序實現三、實現類對比與選擇建議…