數據結構——棧(Java)

目錄

一定義.

入棧

出棧

二.棧與線性表的關系

三.棧的實現方式

四.鏈表實現棧

1.結點的API設計

2.棧的API設計

2.1棧的初始化設計

2.2元素入棧

2.3元素出棧

五.括號匹配問題

完整代碼展示

答案


一定義.

棧是一種基于先進后出(FILO)的數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。
●我們稱數據進入到棧的動作為壓棧,數據從棧中出去的動作為彈棧

●棧(stack)又被稱為堆棧,它是一種只允許在一端(一般是表尾)進行插入和刪除操作的線
性表。
●作為一種特殊的數據結構,由于棧被限定只能在尾進行插入和刪除操作

入棧

出棧

二.棧與線性表的關系

棧是一種特殊的線性表,它同樣由一系列數據元素組成,但是棧的操作受到限制,只允許在一端(稱為棧頂)進行插入(壓棧,push)和刪除(彈棧,pop)操作。棧遵循后進先出(LIFO,Last In First Out)的原則。

三.棧的實現方式

? ? ? ? 棧通過以下兩種方式實現:

? ? ? ? 1.順序表實現

? ? ? ? 2.鏈表實現

? ? ? ? 我們今天講第二種方式。

四.鏈表實現棧

鏈表使用節點來存儲數據元素。每個節點包含數據部分和指向下一個節點的引用。在鏈表實
現棧時,我們通常將鏈表的頭節點作為棧頂

1.結點的API設計

2.棧的API設計

2.1棧的初始化設計

class StackResult<T>
{//結點類class  Node{T data;//存儲數據Node next;//下一個結點public Node(T data, Node next) {this.data = data;this.next = next;}}//記錄首結點private Node head;//元素個數private int N;// 構造方法public StackResult(){//初始化頭結點this.head =new Node(null,null);this.N =0;//s初始元素個數為0}
}

2.2元素入棧

思路分析:根據前面的入棧流程圖,我們可以簡單分為4步

1.找到頭結點指向棧頂的值

2.創建一個新結點,為新棧頂

3.讓頭結點指向新棧頂的值

4.讓新結點指向原來的棧頂

 //把元素入棧public void push(T data){//找到頭結點指向棧頂的值Node oldFirst=head.next;//創建新結點Node newFirst=new Node(data,null);//讓頭結點指向新結點head.next=newFirst;//讓新結點指向原來的棧頂newFirst.next=oldFirst;N++;}

2.3元素出棧

思路分析:

根據前面的出棧流程圖,我們可以分為

1.找到原來頭結點指向棧頂的值

2.讓頭結點指向原來棧頂指向下一個結點的值

 //元素出棧public T pop(){//找到頭結點指向棧頂的的值Node oldFirst=head.next;//檢查是否為空if(oldFirst==null){return null;}//讓頭結點指向原來棧頂指向下一個結點的值head.next=oldFirst.next;N--;return oldFirst.data;}

五.括號匹配問題

問題描述:判斷字符串”(a+b)*(c-d)”字符串中的括號是否匹配

 //括號匹配public static boolean  isMatch(String str ){//創建一個存儲字符串的棧StackResult<Character> stack=new StackResult<>();//遍歷字符串for(int i=0;i<str.length();i++){char ch=str.charAt(i);if(ch=='('){stack.push(ch);//當遇到字符(時,將其入棧}else if (ch==')')//遇到字符串)時,先檢查棧是否為空{if(stack.isEmpty()){return false;//為空返回false}stack.pop();//不為空將其出棧}}return stack.isEmpty();//檢查棧是否為空,為空則說明全部匹配成功,反之失敗}

完整代碼展示

class StackResult<T>
{//結點類class  Node{T data;//存儲數據Node next;//下一個結點public Node(T data, Node next) {this.data = data;this.next = next;}}//記錄首結點private Node head;//元素個數private int N;// 構造方法public StackResult(){//初始化頭結點this.head =new Node(null,null);this.N =0;//s初始元素個數為0}//其他方法---------------------------------------------------//判斷當前棧中的元素個數是否為0public boolean isEmpty(){return N==0;}//獲取棧中的元素個數public int size(){return N;}//把元素入棧public void push(T data){//找到頭結點指向棧頂的值Node oldFirst=head.next;//創建新結點Node newFirst=new Node(data,null);//讓頭結點指向新結點head.next=newFirst;//讓新結點指向原來的棧頂newFirst.next=oldFirst;N++;}//元素出棧public T pop(){//找到頭結點指向棧頂的的值Node oldFirst=head.next;//檢查是否為空if(oldFirst==null){return null;}//讓頭結點指向原來棧頂指向下一個結點的值head.next=oldFirst.next;N--;return oldFirst.data;}//括號匹配public static boolean  isMatch(String str ){//創建一個存儲字符串的棧StackResult<Character> stack=new StackResult<>();//遍歷字符串for(int i=0;i<str.length();i++){char ch=str.charAt(i);if(ch=='('){stack.push(ch);//當遇到字符(時,將其入棧}else if (ch==')')//遇到字符串)時,先檢查棧是否為空{if(stack.isEmpty()){return false;//為空返回false}stack.pop();//不為空將其出棧}}return stack.isEmpty();//檢查棧是否為空,為空則說明全部匹配成功,反之失敗}
}
public class StudentMs3
{public static void main(String[] args){String str ="(a+b)*(c-d)";boolean result = StackResult.isMatch(str);System.out.println(result);}
}

答案

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

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

相關文章

科研筆記:數學建模啟發的課題研究方法

借鑒數學建模的思路解決科學問題或開展課題研究&#xff0c;核心是將實際問題抽象為數學框架&#xff0c;通過定量分析、邏輯推演和驗證優化&#xff0c;實現對問題的精準描述、解釋或預測。其本質是“從現實到數學&#xff0c;再從數學回歸現實”的迭代過程&#xff0c;適用于…

Agent落地到底選擇LangChain 還是 LangGraph

核心概念 LangChain:一個用于構建由大型語言模型驅動的應用程序的框架。它提供了大量的組件和現成的鏈,旨在簡化和標準化應用程序與LLM交互的過程。 LangGraph:一個用于在LangChain之上構建有狀態、多參與者的 工作流 的庫。它特別擅長處理具有循環、分支和復雜協調的代理(…

ChatGPT下的相關聊天提示詞

問&#xff1a;如果我覺得一個子對話里&#xff0c;聊天聊得太多&#xff0c;在這個項目下新開一個子對話&#xff0c;但是不想把上次太多的信息 都復制過來&#xff0c;有沒有什么辦法關鍵詞&#xff1a;項目、子對話&#xff0c;上下文ChatGPT:有辦法的 ?在 ChatGPT 里&…

最新PDF版本!Acrobat Pro DC 2025,解壓即用版

軟件介紹 Adobe Acrobat Pro DC 2025 是全球知名的 PDF 編輯神器&#xff0c;被稱為 “最牛 PDF 工具”&#xff0c;能輕松解決 PDF 編輯、創建、轉換等難題&#xff0c;本次分享的版本解壓即可使用。 軟件特點 然解壓即可使用不用登錄注冊最新版本 軟件使用 我們打開軟件選…

XX汽集團數字化轉型:全生命周期網絡安全、數據合規與AI工業物聯網融合實踐

引言&#xff1a;數字化轉型中的安全與效率雙輪驅動作為中國汽車行業的龍頭企業&#xff0c;XX汽集團近年來積極推進數字化轉型&#xff0c;通過構建全生命周期網絡安全體系、完善數據合規治理框架&#xff0c;并深度融合AI工業物聯網技術&#xff0c;實現了生產成本顯著降低和…

云原生部署_Docker入門

Docker是啥Docker是一個開源的容器化平臺&#xff0c;可以幫助開發者將應用程序和其依賴的環境打包成一個可移植、可部署的容器。Docker的主要目標是通過容器化技術&#xff0c;實現應用程序的快速部署、可移植性和可擴展性&#xff0c;從而簡化應用程序的開發、測試和部署過程…

【大數據專欄】大數據框架-Apache Druid Overview

目錄 Architecture Advantages and disadvantages 從架構以及設計可以得出結論&#xff0c;Durid不支持ACID事務&#xff0c;基于時間戳列和維度列去查詢&#xff0c;所以適合基于時間做分組和學列的查詢操作。 Advantages優勢&#xff1a; 實時數據攝取與查詢 支持秒級數據攝…

云平臺面試內容(一)

1. 云計算的優點、服務模型區別及云部署模式 云計算優點: 云計算具有顯著的優勢,包括無需自建機房和硬件投入,資源即開即用并支持彈性伸縮,按需付費使成本透明可控。企業可以在數分鐘內完成全球范圍的部署,縮短上線周期。同時云平臺提供高可用性和安全性,多副本容災保證數…

嵌入式 - 硬件:51單片機(2)

本節重點&#xff1a;1. GPIO輸入模式、輸出模式2. 按鍵工作原理&#xff08;GPIO輸入&#xff09;3. 中斷概念4. 中斷源概念、中斷源個數、哪幾個中斷源5. 外部中斷、定時器中斷概念6. 中斷處理流程&#xff1a;7. 51單片機中定時器的個數&#xff1f;類型8. 16位定時器和8位…

C語言中奇技淫巧07-使用GCC棧保護選項檢測程序棧溢出

-fstack-protector 是 GCC 和 Clang 編譯器提供的一種棧保護&#xff08;Stack Smashing Protection, SSP&#xff09; 機制&#xff0c;用于檢測和防御常見的緩沖區溢出攻擊&#xff08;特別是棧溢出&#xff09;。它通過在函數的棧幀中插入特殊的“金絲雀值”&#xff08;can…

.NET 8.0 Web API JWT 身份驗證和基于角色的授權

在當今的數字環境中&#xff0c;保護 Web 應用程序的安全至關重要。隨著 .NET 8.0 的不斷發展&#xff0c;它提供了強大的工具來確保您的 API 既安全又高效。 示例代碼&#xff1a;https://download.csdn.net/download/hefeng_aspnet/91490262 如果您喜歡此文章&#xff0c…

ZYNQ SDK軟件在線調試

1、然后右鍵項目->debug as->launch on hardware2、從左到右分別是&#xff1a;運行程序到設置的斷點暫停運行終止斷開連接步進&#xff08;進入函數內部&#xff09;跳過&#xff08;不進入函數內部&#xff09;跳出函數3、雙擊添加斷點&#xff0c;然后點擊運行可以讓程…

四大金剛之計算機操作系統

1. 進程和線程的區別&#xff1f;創建線程的代價比創建進程小嗎&#xff1f;進程是資源分配和調度的基本單位&#xff1b;線程是 CPU 調度的基本單位。進程有獨立的地址空間&#xff0c;線程共享進程地址空間。創建/銷毀進程開銷大&#xff0c;線程開銷小。是的&#xff0c;因為…

redis--redis.conf的相關配置問題

關于redis.conf內的相關重要的配置介紹 1. bind 配置 僅僅設置bind&#xff0c;還需要搭配下面的rotected-mode 配置才能外部ip進行連接 功能&#xff1a;設置 Redis 監聽的 IP 地址&#xff0c;決定哪些設備可以連接到 Redis 服務器。 bind 127.0.0.1&#xff1a;只允許本機&a…

unsloth 筆記:從最近的檢查點繼續微調

檢查點&#xff08;checkpointing&#xff09;可以把微調進度保存下來&#xff0c;這樣可以中途暫停&#xff0c;隨后繼續訓練。首先需要在 Trainer 的參數里添加 save_strategy 和 save_steps。trainer SFTTrainer(....args TrainingArguments(....output_dir "output…

DevOps平臺選型指南:破解研發效率瓶頸,適配金融/政務/國產化場景的5大關鍵指標

在數字化轉型的浪潮中&#xff0c;軟件研發效能已成為企業的核心競爭力。然而&#xff0c;許多團隊在追求敏捷與高速交付的過程中&#xff0c;常常會遇到工具鏈割裂、流程冗長、環境混亂等效率瓶頸。選擇一個合適的、一體化的DevOps平臺&#xff0c;是破解這些瓶頸、實現研發運…

【面試向】元宇宙介紹

屬于基礎知識介紹&#xff0c;主要目的是對這一概念有技術層面的理解&#xff0c;有前瞻性的觀點&#xff0c;幫助大家在面試中給出得體的表述。 1. 什么是元宇宙&#xff1f; 元宇宙本質上是一個融合了數字與現實、由技術構建的 “沉浸式虛擬空間”&#xff0c;是一個 “超越…

FreeMarker快速入門指南

FreeMarker快速入門指南 FreeMarker是一個基于模板和數據模型生成文本輸出的Java庫。它廣泛應用于Web開發、代碼生成、郵件模板等場景。本文將帶你快速上手FreeMarker的核心概念和基本用法。 什么是FreeMarker FreeMarker是一個模板引擎&#xff0c;它將模板文件&#xff08;.f…

Nginx主配置文件

一&#xff0c;Nginx基本介紹1&#xff0c;nginx概念Nginx 是一款輕量級、高性能的服務器軟件&#xff0c;核心能力是 “處理網絡請求”&#xff0c;被廣泛用于網站、App 的后端架構中。Nginx 就像一個 “高效的網絡交通指揮官”&#xff0c;核心價值是用最少的資源&#xff0c…

基于ResNet50的智能垃圾分類系統

基于ResNet50的智能垃圾分類系統&#xff1a;從理論到實踐的完整指南 源碼獲取https://mbd.pub/o/bread/YZWXlZ1yZg 引言&#xff1a;智能垃圾分類的時代背景與意義 隨著城市化進程的加速和人口數量的增長&#xff0c;垃圾處理問題日益成為全球性的環境挑戰。傳統的垃圾分類…