數據結構-棧和隊列

目錄

棧的概念

棧的使用

?編輯?模擬實現棧

中綴表達式轉后綴表達式

括號匹配

出棧入棧次序匹配

隊列概念

隊列的使用


棧的概念

棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行數據插入和刪除操作的一端稱為棧頂,;另一端稱為棧底.棧中的數據元素遵守先進后出的原則.

壓棧:棧的插入操作叫做壓棧/進棧/入棧,入數據在棧頂.

出棧:棧的刪除操作叫做出棧.出數據在棧頂.

棧的底層是一個動態的數組.因此其中的元素在物理和邏輯上都是連續的.

棧的使用

?模擬實現棧

import java.util.Arrays;public class MyStack {public int[] elem;public int usedSize;public static final int DEFAULT_SIZE = 10;public MyStack(){this.elem = new int[DEFAULT_SIZE];}/*** 壓棧*/public int push(int val){if (isFull()){elem = Arrays.copyOf(elem,2*elem.length);}this.elem[usedSize] = val;usedSize++;return val;}public boolean isFull(){return usedSize == elem.length;}//出棧public int pop(){if (empty()){throw new MyEmptyStackException("棧為空!");}int ret = elem[usedSize-1];usedSize--;return ret;}public boolean empty(){return usedSize == 0;}public int peek(){if (empty()){throw new MyEmptyStackException("棧為空!");}return elem[usedSize-1];}
}

中綴表達式轉后綴表達式

后綴表達式又叫做逆波蘭式.

快捷的轉換方式:

寫代碼:將后綴表達式123*+45*6+7*+進行計算,求結果.

這類問題就是利用棧.

思路就是遍歷這個表達式,遇到數字就入棧,遇到運算符出棧頂兩個元素,第一個元素作為右操作數,第二個元素作為左操作數.

class?Solution?{

????public?int?evalRPN(String[]?tokens)?{

????????Stack<Integer>?stack?=?new?Stack<>();

????????//遍歷字符串數組,不是運算符就入棧

????????for(String?s:tokens){

????????????if(!isOperations(s)){

????????????????stack.push(Integer.parseInt(s));

????????????}else{

????????????????//是運算符就出棧頂兩個元素

????????????????//第一個元素作為右操作數

????????????????int?num2?=stack.pop();

????????????????//第二個元素作為左操作數

????????????????int?num1?=?stack.pop();

????????????????switch(s){

????????????????????case?"+":

????????????????????stack.push(num1+num2);

????????????????????break;

????????????????????case?"-":

????????????????????stack.push(num1-num2);

????????????????????break;

????????????????????case?"*":

????????????????????stack.push(num1*num2);

????????????????????break;

????????????????????case?"/":

????????????????????stack.push(num1/num2);

????????????????????break;

????????????????}

????????????}

????????}

????????//最后棧里剩的元素就是結果

????????return?stack.pop();

????}

????//判斷是不是運算符

????public?boolean?isOperations(String?s){

????????if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){

????????????return?true;

????????}

????????return?false;

????}

}


括號匹配

思路:遍歷字符串,是左括號就壓棧,右括號就出棧,看是否匹配.如果字符串遍歷完成,此時棧也是空的,就是匹配的.

class?Solution?{

????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{

????????????????if(stack.empty()){

????????????????????return?false;

????????????????}

????????????????char?ch2?=?stack.peek();

????????????????if(ch2=='['&&ch==']'?||ch2=='{'&&ch=='}'?||ch2=='('&&ch==')'){

????????????????????stack.pop();

????????????????}else{

????????????????????return?false;

????????????????}

????????????}

????????}

????????if(!stack.empty()){

????????????return?false;

????????}

????????return?true;

????}

}


出棧入棧次序匹配

思路: 用i下標遍歷PushV數組,直接入棧;

入棧之后判斷j下標元素是不是當前入棧的元素,如果是則出棧,j++,并且彈出棧頂元素,彈出之后判斷棧頂元素是不是和j下標元素一樣,一樣則繼續彈出,不一樣則i++.

如果不是就繼續i++.

循環遍歷完之后,棧里還有元素就說明是不匹配的.

public class Solution {

? ? /**

? ? ?* 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可

? ? ?*

? ? ?*

? ? ?* @param pushV int整型一維數組

? ? ?* @param popV int整型一維數組

? ? ?* @return bool布爾型

? ? ?*/

? ? public boolean IsPopOrder (int[] pushV, int[] popV) {

? ? ? ? Stack<Integer> stack = new Stack<>();

? ? ? ? int j = 0;//遍歷popV數組

? ? ? ? for(int i=0;i<pushV.length;i++){

? ? ? ? ? ? stack.push(pushV[i]);

? ? ? ? ? ? while(!stack.empty()&&stack.peek()==popV[j]){

? ? ? ? ? ? ? ? stack.pop();

? ? ? ? ? ? ? ? j++;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return stack.empty();

? ? }

}


棧,虛擬機棧和棧幀的區別

棧是一種先進后出的數據結構.

虛擬機棧:是jvm的一塊內存空間.

棧幀:是在調用函數的過程當中,在Java虛擬機棧上開辟的一塊內存.


隊列概念

只允許在一段進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出的特點.入隊列:進行插入操作的一段稱為隊尾.出隊列:進行刪除操作的一端稱為隊頭.

在Java中,Queue是一個接口,低等是通過鏈表實現的.

隊列的使用

Queue是個接口,在實例化時必須實例化LinkedList的對象,因為LinkedList實現了Queue接口.

add方法也是入隊列,它和offer的區別就是add方法在隊列容量有限制的情況下如果沒有可用空間了,就會拋出異常而offer不會.

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

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

相關文章

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

面試攻略,Java 基礎面試 100 問(十五)

final, finally, finalize 的區別? final&#xff1a;修飾符&#xff08;關鍵字&#xff09;有三種用法&#xff1a;如果一個類被聲明為 final&#xff0c;意味著它不能再派生出新的子類&#xff0c;即不能被繼承&#xff0c;因此它和 abstract 是反義詞。將變量聲明為 final…

動手學DL——MLP多層感知機【深度學習】【PyTorch】

文章目錄 4、多層感知機&#xff08; MLP&#xff09;4.1、多層感知機4.1.1、隱層4.1.2、激活函數 σ 4.2、從零實現多層感知機4.3、簡單實現多層感知機4.4、模型選擇、欠擬合、過擬合4.5、權重衰退4.6、丟失法|暫退法&#xff08;Dropout&#xff09;4.6.1、dropout 函數實現4…

大數據--難點--地圖的制作

地圖一直是亮點也是難點&#xff0c;剛剛進公司的時候也很難懂~~做出來的也很難看 純CSS3使用vw和vh視口單位實現h5頁面自適應&#xff0c;gulp自動監聽sass改動并保存到css中 當修改了sass里面的代碼后&#xff0c;gulp會自動監聽修改內容并同名保存到css文件夾中&#xff0…

C#字符串占位符替換

using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}歲&#xff0c;身高{2}cm&#xff0c;月收入{3}元&#xff1b;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…

02-C++數據類型-高級

數據類型-高級 4、復合類型 4.4、結構簡介 struct inflatable {char name[20];float vol;double price; };inflatable vincent; //C struct inflatable goose; //C例子 // structur.cpp -- a simple structure #include <iostream> struct inflatable // structu…

B057-spring增強 依賴注入 AOP 代理模式 創建Bean

目錄 AOP概念代理模式引出AOP實現方式xml方式實現注解方式實現 AOP 概念 事務管理&#xff1a;比如可以抽取try catch的重復代碼 日志監控&#xff1a;比如業務邏輯前后打印關于當前訂單數量的日志&#xff0c;了解業務做了什么 性能監控&#xff1a;比如業務前后打印時間&…

浪潮信息趙帥:多元算力時代 開源開放的OpenBMC成為服務器管理優先解

“多元算力時代下&#xff0c;大規模的異構服務器設備面臨多種處理器架構、多種設備協議、不同管理芯片兼容的系統化設計挑戰&#xff0c;管理固件也迎來新的變革。開源開放的OpenBMC&#xff0c;以創新的分層解耦軟件架構&#xff0c;兼容不同處理器架構、算力平臺和管理芯片&…

人流目標跟蹤pyqt界面_v5_deepsort

直接上效果圖 代碼倉庫和視頻演示b站視頻006期&#xff1a; 到此一游7758258的個人空間-到此一游7758258個人主頁-嗶哩嗶哩視頻 代碼展示&#xff1a; YOLOv5 DeepSORT介紹 YOLOv5 DeepSORT是一個結合了YOLOv5和DeepSORT算法的目標檢測與多目標跟蹤系統。讓我為您詳細解釋一…

【字典學習+稀疏編碼Sparse Encoding】簡單介紹與sklearn的實現方式

文章目錄 1、字典學習與稀疏編碼2、sklearn的實現3、示例 1、字典學習與稀疏編碼 簡單來說&#xff0c;稀疏編碼就是把輸入向量&#xff08;信號&#xff09;/ 矩陣&#xff08;圖像&#xff09;表示為稀疏的系數向量和一組超完備基向量&#xff08;字典&#xff09;的線性組合…

vim打開文件中文是亂碼

vim打開文件中文是亂碼 問題&#xff1a;在Linux系統下&#xff0c;使用cat查看含有中文的文本文件正常&#xff0c;但是使用vim打開卻是亂碼 解決方法&#xff1a; 方法一&#xff1a; 在文件中設定 在vim的退出模式下 :set encodingutf8 方法二&#xff1a; 直接寫入/etc/…

ASP.NET WEB API通過SugarSql連接MySQL數據庫

注意&#xff1a;VS2022企業版可以&#xff0c;社區版可能存在問題。實體名稱和字段和數據庫中的要一致。 1、創建項目&#xff0c;安裝SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件結構 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …

Ubuntu 軟件依賴出錯處理

現象&#xff1a; apt-get install vim 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 您可能需要運行“apt-get -f install”來糾正下列錯誤&#xff1a; 下列軟件包有未滿足的依賴關系&#xff1a; cuttlefish-base : 依賴: f2fs-tools…

DG故障切換及DG Broker失效配置清理

DG故障切換及DG Broker失效配置清理 DG故障強制切主DG Broker原有配置清理 DG故障強制切主 主庫發生故障無法在短時間內恢復時&#xff0c;需要執行主備切換。此時由于DG Broker無法連接到主庫&#xff0c;故不能通過Broker切換&#xff0c;只能手動在備庫進行切主。 --斷開備…

Neo4j之MERGE基礎

在 Neo4j 中&#xff0c;MERGE 語句用于根據指定的模式進行創建或匹配節點和關系。它可以在節點或關系不存在時創建它們&#xff0c;并在已存在時進行匹配。 創建或匹配節點&#xff1a; MERGE (p:Person {name: John});這個查詢會檢查是否已經存在一個具有 "Person&quo…

搭建WebDAV服務手機ES文件瀏覽器遠程訪問

文章目錄 1. 安裝啟用WebDAV2. 安裝cpolar3. 配置公網訪問地址4. 公網測試連接5. 固定連接公網地址6. 使用固定地址測試連接 有時候我們想通過移動設備訪問群暉NAS 中的文件,以滿足特殊需求,我們在群輝中開啟WebDav服務,結合cpolar內網工具生成的公網地址,通過移動客戶端ES文件…

【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-排序模擬

文章目錄 Find And Replace in String 字符串中的查找與替換問題描述&#xff1a;分析代碼排序模擬 Tag Find And Replace in String 字符串中的查找與替換 問題描述&#xff1a; 你會得到一個字符串 s (索引從 0 開始)&#xff0c;你必須對它執行 k 個替換操作。替換操作以三…

docker通用鏡像方法,程序更新時不用重新構建鏡像

docker通用鏡像方法&#xff0c;程序更新時不用重新構建鏡像。更新可執行文件后&#xff0c;重新啟動容器就可運行。 功能 1、在demo目錄下添加腳本文件start.sh&#xff0c;里面執行demo.jar文件。 2、將demo目錄映射到鏡像下的 /workspace目錄。 3、Dockerfile文件中默認…

如何在Linux中強制關閉卡住的PyCharm

在使用PyCharm進行Python開發時&#xff0c;有時可能會遇到卡頓或無響應的情況。當PyCharm卡住時&#xff0c;我們需要強制關閉它以恢復正常操作。今天&#xff0c;我們將介紹在Linux系統中如何強制關閉PyCharm的幾種方法。 1. 使用鍵盤快捷鍵 在PyCharm所在的窗口中&#xf…

臺灣shopee:蝦皮電商平臺選品方法與市場機遇

臺灣Shopee蝦皮電商平臺為臺灣本土賣家和消費者提供了一個線上交易平臺。對于想要在臺灣市場做蝦皮電商的賣家來說&#xff0c;選擇合適的產品是非常重要的。本文介紹一些做蝦皮電商的選品方法和策略。 首先&#xff0c;了解市場需求是選品的基礎。在進入臺灣Shopee市場之前&a…