Java數據結構——Stack

Stack

  • 棧的概念和使用
    • 棧的概念
    • 棧的使用
  • 棧的應用
    • 出棧元素序列
    • 有效的括號
    • 棧的壓入、彈出序列
    • 逆波蘭表達式
    • 最小棧

棧的概念和使用

棧的概念

棧(Stack):一種特殊的線性表,只允許再棧的一端進行插入和刪除元素,這一端點被稱為棧頂另一端就是棧頂
棧中有兩種使用:
入棧(push):插入數據進入棧中,入棧在棧頂
出棧(pop):刪除棧中數據,出的是棧頂的數據
遵循的是先入后出的原則

在這里插入圖片描述

棧的使用

方法功能
Stack()構造空的棧
E push(E e)將e入棧,返回e
E pop()將棧頂元素取出
E peek()獲取棧頂元素
int size()棧的有效元素個數
boolean empty()判斷棧是否為空

E push(E e) 將e入棧,返回e

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(10);System.out.println(stack);}
}

運行結果如下
在這里插入圖片描述

E pop() 將棧頂元素取出
E peek() 獲取棧頂元素

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(10);System.out.println(stack);int ret = stack.pop();//10 ,取出棧頂元素int ret1 = stack.peek();//2 //獲取棧頂元素是多少System.out.println(ret);System.out.println(ret1);System.out.println("出棧后"+stack);//出棧后,棧中數據 1 2}
}

這里的pop是出棧的意思,而peek()只是獲取其棧頂元素,并不是出棧,不會影響棧中元素
所以這里會取出棧頂元素10 而 在獲取棧頂元素是2,最終棧中元素是1 2
在這里插入圖片描述

int size() 棧的有效元素個數
boolean empty() 判斷棧是否為空

public class Test {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(1);stack.push(2);stack.push(3);stack.push(5);stack.push(11);System.out.println(stack.size());//棧的元素個數 5 System.out.println(stack.empty());//這里棧不為空,false}
}

在這里插入圖片描述

棧的應用

出棧元素序列

題目:若進棧序列為 1,2,3,4 ,進棧過程中可以出棧,則下列不可能的?個出棧序列是()
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
答案是 C
A : 如果是1進棧,1出棧,在將1 2 3放入進去再出棧,這樣出棧結果就1 4 3 2
B: 1進棧,先不出來,2 3 4依次進棧后就出棧,這樣結果出棧結果為 2 3 4 1
C: 先出3 說明 1 2 3已經進棧了,3 出棧 2就是棧頂,不可以直接出1,所以錯誤
D 1 2 進棧,3 4分別進棧后出棧,最后出棧2 1結果為 3 4 2 1
在這里插入圖片描述
C選項錯誤,所以選C

有效的括號

在這里插入圖片描述

目的:括號是否可以左右匹配成功 “()” 或者 "([ ])"類型的都是匹配成功
思路:1創建一個Character類型的棧
2.如果遇到左邊括號就將其放入棧中遇到右括號就與棧頂括號元素進行匹配,匹配不成功就直接返回false,匹配成功就繼續向后匹配,入棧重復操作
3 在匹配的時候,如果棧為空,返回false
4.最后右括號匹配完成,但是棧不為空也返回false

在這里插入圖片描述
在這里插入圖片描述

1.這里再進行匹配的時候如果棧為空說明沒有其右括號左邊沒有左括號入棧
2.如果匹配失敗直接
3.最后字符串遍歷完了,但是不為空,說明棧中的左括號沒有全部匹配
這上面三種情況不符合要求直接返回false
class Solution {public boolean isValid(String s) {//創建一個Character的棧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{//匹配//1.判斷棧是否為空if(stack.empty()){return false;}//2.出棧進行匹配char ch2 = stack.peek();if(ch2=='('&&ch==')'||ch2=='['&&ch==']'||ch2=='{'&&ch=='}'){stack.pop();}else{//不匹配return false;}}}//最后如果棧不為空,說明還有沒匹配的if(!stack.empty()){return false;}return true;}
}

棧的壓入、彈出序列

在這里插入圖片描述

目的:有一個所有數都不相同的pushV數組壓棧順序,有一個和壓棧的數相同出棧順序,判斷這個出棧順序是否正確
思路:1.遍歷這個pushV,將其元素進行入棧,2.并進行判斷,棧頂元素是否與出棧順序相同,相同就出棧,不相同就繼續入棧,繼續判斷,重復操作
最后遍歷完整個pushV數組,如果棧為空,說明其出棧順序正確

在這里插入圖片描述
在這里插入圖片描述

1.這里的進行棧頂元素與popV判斷明顯是個while循環,因為可能連續出棧
2.并且這個循環不僅要判斷是否相同也要注意棧不為空再進行判斷
3.遍歷完整個pushV數組后,最后如果棧為空說明出棧順序是對的返回true,反之是false
import java.util.*;public boolean IsPopOrder (int[] pushV, int[] popV) {// write code hereStack<Integer> stack = new Stack<>();int j=0;//遍歷彈出序列for(int i = 0;i<pushV.length;i++){//入棧stack.push(pushV[i]);//根據給出彈出的序列看看是否要出棧while(!stack.empty()&&stack.peek()==popV[j]){j++;stack.pop();//出棧}}//如果最后stack為空,說明成功了return stack.empty();}
}

逆波蘭表達式

在這里插入圖片描述
逆波蘭式
在這里插入圖片描述

目的:給一個逆波蘭表達式,求出其結果
思路:使用棧進行計算,遇到數字就入棧,反之就是運算符,就要出棧進行計算

在這里插入圖片描述
在這里插入圖片描述

1.這里就是遇到數字字符就進行入棧,這里注意將數字字符轉為數字,
2.遇到運算符就要計算,將計算結果入棧
3.最后返回棧頂數據就是計算結果
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for(String str: tokens){if(!isOperator(str)){stack.push(Integer.valueOf(str));//轉換為數字入棧}else{//反之就出棧計算//將計算結果入棧int val1 = stack.pop();int val2 = stack.pop();switch(str){case "+":stack.push(val2+val1);break;case "-":stack.push(val2-val1);break;case "*":stack.push(val2*val1);break;case "/":stack.push(val2/val1);break;}}}return stack.pop();}//判斷是不是運算符private boolean  isOperator(String s){if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){return true;}return false;}
}

最小棧

在這里插入圖片描述

目的:獲取其棧中最小元素
思路:就是創建兩個棧,1.正常棧一個棧是正常將所有元素依靠順序入棧,出棧
2.最小棧用來放棧中最小元素,棧頂是最小元素,這樣獲取最小元素的效率是O(1)

>

在這里插入圖片描述

注意這里在入棧的時候也要將和最小棧相同的元素也要放入進去
出棧的時候,也要注意棧的最小元素可能發生變化,最小棧可能也要出棧
這時候無論如何,最小棧棧頂就是棧中最小的元素
class MinStack {private Stack<Integer> stack;private Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {//將=最小棧頂元素的值也要放入最小棧if(minStack.empty()||val<=minStack.peek()){minStack.push(val);}stack.push(val);}public void pop() {//注意這里如果出棧的話,最小值可能發生變化if(stack.peek().equals(minStack.peek())){minStack.pop();}stack.pop();}public int top() {return stack.peek();  }public int getMin() {return minStack.peek();}
}

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

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

相關文章

神經網絡與計算機視覺

2016 年,隨著 AlphaGo 在圍棋比賽中擊敗李世石,“人工智能”、“神經網絡”、“深度 學習”等字眼便越來越多的出現在大眾眼前,智能化好像成為一種不可逆轉的趨勢,帶給大家新奇感的同時也帶來了一絲憂懼:在不遠的未來,機器是否真的擁有思維和情感?《終結者》中天網大戰人…

VS2019 與gitcode團隊管理

1、安裝git 點擊下一步安裝即可 2、vs2019連接gitcode 然后更改本地的代碼添加文件等都可以進行遠程同步操作了

Python類和對象四(十三)

魔法方法&#xff1a; 按位運算 按位于運算 只要相同才是1 或運算&#xff1a; 只要某個位是1結果就是1 、 按位非 將結果取反 按位異或&#xff1a; 左移和右移運算符&#xff1a; 右移兩位 右移動n位&#xff0c;就是除以2的n次方 左移兩位&#xff1a; 左移n位就是乘…

如何設置極狐GitLab 議題截止日?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 截止日期 (BASIC ALL) 可以在議題中使用截止日期&#xff0c;來跟蹤截止日期并確保功能按時交付。用戶至少需要報告者權限才…

如何在 Conda 環境中降級 Python 版本:詳細指南

如何在 Conda 環境中降級 Python 版本&#xff1a;詳細指南 Python 版本的管理在開發過程中至關重要&#xff0c;特別是在處理不同項目需求時。對于使用 Conda 環境的 Python 程序員來說&#xff0c;版本管理不僅僅是安裝不同的 Python 版本&#xff0c;還涉及到依賴關系的兼容…

【隨筆】地理探測器原理與運用

文章目錄 一、作者與下載1.1 軟件作者1.2 軟件下載 二、原理簡述2.1 空間分異性與地理探測器的提出2.2 地理探測器的數學模型2.21 分異及因子探測2.22 交互作用探測2.23 風險區與生態探測 三、使用&#xff1a;excel 一、作者與下載 1.1 軟件作者 作者&#xff1a; DOI: 10.…

使用達夢官方管理工具SQLark快速生成數據庫ER圖并導出

在數據庫設計與開發中&#xff0c;實體-關系圖&#xff08;ER 圖&#xff09;作為數據建模的核心工具&#xff0c;能夠直觀呈現表結構、字段屬性及表間關系&#xff0c;是團隊溝通和文檔維護的重要工具。然而&#xff0c;對于許多使用達夢數據庫的開發者來說&#xff0c;可用的…

單精度浮點運算/定點運算下 MATLAB (VS) VIVADO

VIVADO中單精度浮點數IP核計算結果與MATLAB單精度浮點數計算結果的對比 MATLAB定點運算仿真&#xff0c;對比VIVADO計算的結果 目錄 前言 一、VIVADO與MATLAB單精度浮點數運算結果對比 二、MATLAB定點運算仿真 總結 前言 本文介紹了怎么在MATLAB中使用單精度浮點數進行運算…

力扣-141.環形鏈表

題目描述 給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中存在環 &#xff0c;則返回 true 。 否則&#xff0c;返回 false 。 class Solution { public:bool hasCycle(ListNode *head) {ListNode *fast head;ListNode *slow head;while (fast! n…

RESTful學習筆記(一)

Web發展 一、API 程序硬件接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是預先定義好的邏輯函數&#xff0c;軟件系統不同組成部分銜接的約定&#xff0c;直接調用函數&#xff0c;無序訪問代碼細節&#xff0c;分為SDK和Web應用接口兩類 SDK…

SD2351核心板:重構AI視覺產業價值鏈的“超級節點”

在AI視覺技術狂飆突進的當下&#xff0c;一個吊詭的現象正在浮現&#xff1a;一方面&#xff0c;學術界不斷刷新著ImageNet等基準測試的精度紀錄&#xff1b;另一方面&#xff0c;產業界卻深陷“算法有、場景無&#xff0c;技術強、落地難”的怪圈。明遠智睿SD2351核心板的問世…

【數據結構】紅黑樹原理及實現

目錄 一. 紅黑樹的概念1. 紅黑樹的規則思考 2. 紅黑樹的效率 二.紅黑樹的實現1. 紅黑樹的結構2. 紅黑樹的插入3. 紅黑樹的平衡調整情況1&#xff1a;變色情況2&#xff1a;單旋變色情況3&#xff1a;雙旋變色 4. 紅黑樹插入及平衡調整代碼實現5.紅黑樹的驗證 一. 紅黑樹的概念 …

時間復雜度分析

復雜度分析的必要性&#xff1a; 當給我們一段代碼時&#xff0c;我們是以什么準則來判斷代碼效率的高低呢&#xff1f;每一段代碼都會消耗一段時間&#xff0c;或占據一段數據空間&#xff0c;那么自然是在實現相同功能的情況下&#xff0c;代碼所耗時間最少&#xff0c;所占…

L1-1、Prompt 是什么?為什么它能“控制 AI”?

*Prompt 入門 L1-1 想象一下&#xff0c;你只需輸入一句話&#xff0c;AI 就能自動為你寫一篇文案、生成一份報告、甚至規劃你的創業計劃。這種“對話即編程”的背后魔法&#xff0c;就是 Prompt 的力量。 &#x1f50d; 一、Prompt 的定義與由來 Prompt&#xff08;提示詞&am…

微信小程序文章管理系統開發實現

概述 在內容為王的互聯網時代&#xff0c;高效的文章管理系統成為各類平臺的剛需。幽絡源平臺今日分享一款基于SSM框架開發的微信小程序文章管理系統完整解決方案&#xff0c;該系統實現了多角色內容管理、智能分類、互動交流等功能。 主要內容 一、用戶端功能模塊 ??多角…

【Python-Day 5】Python 格式化輸出實戰:%、format()、f-string 對比與最佳實踐

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

R7周:糖尿病預測模型優化探索

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 一、數據預處理 1.設置GPU import torch.nn.functional as F import torch.nn as nn import torch, torchvisiondevice torch.device("cuda"…

使用Tortoise-ORM和FastAPI構建評論系統

title: 使用Tortoise-ORM和FastAPI構建評論系統 date: 2025/04/25 21:37:36 updated: 2025/04/25 21:37:36 author: cmdragon excerpt: 在models.py中定義了Comment模型,包含id、content、created_at、updated_at字段,并與User和Article模型建立外鍵關系。schemas.py中定義了…

【VS Code】如何使用SSH打開遠程服務器Docker上的項目或文件夾

要在VS Code中使用SSH打開遠程服務器Docker上的項目或文件夾&#xff0c;您需要結合使用VS Code的Remote - SSH擴展和Docker的遠程訪問功能。以下是詳細步驟&#xff1a; 安裝VS Code Remote - SSH擴展 打開VS Code。點擊左側活動欄的擴展圖標&#xff08;或使用快捷鍵CtrlShif…

NHANES指標推薦:PLP

文章題目&#xff1a;Association of pyridoxal 5-phosphate (PLP) with lipid profiles: a population-based cohort study DOI&#xff1a;10.3389/fnut.2025.1545301 中文標題&#xff1a;5-磷酸吡哆醛 (PLP) 與血脂譜的關系&#xff1a;一項基于人群的隊列研究 發表雜志&am…