數據結構之棧:原理與常用方法

1. 棧的定義

Stack是Vector的一個子類,它實現標準的后進先出堆棧。Stack只定義了創建空堆棧的默認構造方法。(實際上是實現了List接口,因為Vector是List的子類)。

Stack() // 創建一個空棧

2. 棧的基本操作

// 壓棧操作
public E push(E item) // 將元素壓入棧頂// 彈棧操作
public E pop() // 移除棧頂元素并返回該元素// 查看棧頂元素但不移除
public E peek() // 查看棧頂元素但不移除// 判斷棧是否為空
public boolean empty() // 測試棧是否為空// 查找元素在棧中的位置(從棧頂開始為1)
public int search(Object o) // 返回對象在棧中的位置,1表示棧頂

3. 繼承自Vector的方法

由于Stack繼承自Vector,所以還擁有以下方法:

// 獲取棧的大小
public int size() // 判斷棧是否包含指定元素
public boolean contains(Object o)// 返回指定位置的元素
public E get(int index)// 清空棧
public void clear()

4. Java 中的 Stack 類

Java 提供了一個內置的 Stack 類,它擴展了 Vector 類。盡管 Stack 類仍然可用,但在現代 Java 編程中,通常推薦使用 Deque 接口的實現(如 ArrayDeque )來模擬棧的行為。

  • 由于Stack繼承自Vector,所有方法都是同步的,這在多線程環境下是安全的,但在單線程環境下會有性能損失。
  • Deque接口提供了更完整的棧操作,性能更好(非同步實現)

4.1. 使用 Java 的 Stack 類

import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<String> stack = new Stack<>();// 壓棧操作stack.push("Apple");stack.push("Banana");stack.push("Cherry");// 查看棧大小System.out.println("Stack size: " + stack.size()); // 輸出: 3// 查看棧頂元素System.out.println("Top element: " + stack.peek()); // 輸出: Cherry// 彈棧操作System.out.println("Popped: " + stack.pop()); // 輸出: CherrySystem.out.println("Popped: " + stack.pop()); // 輸出: Banana// 判斷棧是否為空System.out.println("Is stack empty? " + stack.empty()); // 輸出: false// 查找元素位置System.out.println("Apple position: " + stack.search("Apple")); // 輸出: 1// 清空棧stack.clear();System.out.println("Is stack empty after clear? " + stack.empty()); // 輸出: true}
}

4.2. 使用 Deque 接口實現棧

import java.util.ArrayDeque;
import java.util.Deque;public class DequeAsStackExample {public static void main(String[] args) {Deque<String> stack = new ArrayDeque<>();// 壓棧stack.push("Apple");stack.push("Banana");stack.push("Cherry");System.out.println("Stack: " + stack);// 出棧String top = stack.pop();System.out.println("Popped element: " + top);// 查看System.out.println("Top element: " + stack.peek());System.out.println("Updated stack: " + stack);// 判空System.out.println("Is stack empty? " + stack.isEmpty());}
}

5. 實現自定義棧

我們可以使用數組或鏈表來實現自定義棧。以下是使用數組實現的簡單棧:

public class ArrayStack<T> {private T[] array;private int top;private int capacity;@SuppressWarnings("unchecked")public ArrayStack(int capacity) {this.capacity = capacity;array = (T[]) new Object[capacity];top = -1;}public void push(T item) {if (isFull()) {throw new IllegalStateException("Stack is full");}array[++top] = item;}public T pop() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}return array[top--];}public T peek() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}return array[top];}public boolean isEmpty() {return top == -1;}public boolean isFull() {return top == capacity - 1;}
}

6. 棧的應用

棧在計算機科學和日常編程中有廣泛的應用,例如:

  1. 函數調用和遞歸
  2. 表達式求值和語法解析
  3. 撤銷操作(Undo)
  4. 深度優先搜索(DFS)算法
  5. 括號匹配問題

7. 棧的實際應用示例

7.1. 括號匹配

public static boolean isBalanced(String expression) {Stack<Character> stack = new Stack<>();for (char ch : expression.toCharArray()) {if (ch == '(' || ch == '[' || ch == '{') {stack.push(ch);} else if (ch == ')' || ch == ']' || ch == '}') {if (stack.isEmpty()) {return false;}char top = stack.pop();if ((ch == ')' && top != '(') || (ch == ']' && top != '[') || (ch == '}' && top != '{')) {return false;}}}return stack.isEmpty();
}

7.2. 逆波蘭表達式求值

public static int evaluateRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {int b = stack.pop();int a = stack.pop();switch (token) {case "+": stack.push(a + b); break;case "-": stack.push(a - b); break;case "*": stack.push(a * b); break;case "/": stack.push(a / b); break;}} else {stack.push(Integer.parseInt(token));}}return stack.pop();
}

8. 棧的優缺點

優點:

  • 實現簡單
  • 后進先出的特性適用于許多算法和問題解決
  • 函數調用和遞歸的基礎

缺點:

  • 只能訪問最頂端的元素
  • 不支持隨機訪問
  • 大小通常是固定的(使用數組實現時)

9. 參考資料

Java 數據結構 - 棧(Stack) - KenWan - 博客園

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

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

相關文章

鴻蒙OSUniApp 開發支持圖片和視頻的多媒體展示組件#三方框架 #Uniapp

使用 UniApp 開發支持圖片和視頻的多媒體展示組件 前言 在現代移動應用中&#xff0c;圖片和視頻已成為內容展示的主流形式。一個優秀的多媒體展示組件不僅能提升用戶體驗&#xff0c;還能增強產品的互動性和視覺沖擊力。隨著鴻蒙&#xff08;HarmonyOS&#xff09;生態的不斷…

STM32CubeMX,arm-none-eabi-gcc簡單試用

在windows下&#xff0c;為stm32系列單片機編程&#xff0c;keil有了免費的試用版&#xff0c;有很多開發板示例&#xff0c;給學習單片機編程帶來很大的方便。 STM32CubeMX提供了stm32單片機的功能設置&#xff0c;在輸出方式上給出了幾種方式&#xff0c;有mdk&#xff08;k…

灌水論壇系統總體設計文檔

一、實驗題目 灌水論壇系統 二、實驗目的 旨在通過一個相對完整且功能豐富的Web應用實例&#xff0c;全面地實踐和鞏固Web開發所需的各項核心技術和工程方法&#xff0c;從而提升其綜合應用能力和解決實際開發問題的能力。它不僅僅是完成一個軟件&#xff0c;更是一個學習、…

Android 13中 配置簽名文件與內置相應的Apk

目錄 1.問題場景 2.實現思路 3.將測試代碼做成APK并配置簽名 4.將apk內置到系統當中的方法 1.問題場景 在展訊平臺中Android13的源碼已知的情況下&#xff0c;客戶寫了一個測試類用于調用系統中的一些接口來檢驗一些功能。為了方便調試排查問題我首先的思路是將客戶寫的測試…

HarmonyOS 5 應用開發導讀:從入門到實踐

一、HarmonyOS 5 概述 HarmonyOS 5 是華為推出的新一代分布式操作系統&#xff0c;其核心設計理念是"一次開發&#xff0c;多端部署"。與傳統的移動操作系統不同&#xff0c;HarmonyOS 5 提供了更強大的跨設備協同能力&#xff0c;支持手機、平板、智能穿戴、智慧屏…

C語言創意編程:用趣味實例玩轉基礎語法(4)

文章目錄 0. 前言1. &#x1f308; 彩虹文字生成器1.1 程序效果展示1.2 完整代碼解析1.3 關鍵技術詳解1.3.1 Windows控制臺API1.3.2 顏色編碼1.3.3 安全輸入1.3.4 跨平臺考慮 2. &#x1f3b5; 簡易音樂播放器2.1 程序效果展示2.2 完整代碼解析2.3 關鍵技術詳解2.3.1 Windows B…

【專題】神經網絡期末復習資料(題庫)

神經網絡期末復習資料&#xff08;題庫&#xff09; 鏈接&#xff1a;https://blog.csdn.net/Pqf18064375973/article/details/148332887?sharetypeblogdetail&sharerId148332887&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 【測試】 Th…

Python訓練營打卡 Day41

簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch…

leetcode216.組合總和III:回溯算法中多條件約束下的狀態管理

一、題目深度解析與組合約束條件 題目描述 找出所有相加之和為n的k個數的組合&#xff0c;且滿足以下條件&#xff1a; 每個數只能使用一次&#xff08;范圍為1到9&#xff09;所有數字均為唯一的正整數組合中的數字按升序排列 例如&#xff0c;當k3&#xff0c;n9時&#…

Java面試實戰:從Spring到大數據的全棧挑戰

Java面試實戰&#xff1a;從Spring到大數據的全棧挑戰 在某家知名互聯網大廠&#xff0c;嚴肅的面試官正在面試一位名叫謝飛機的程序員。謝飛機以其搞笑的回答和對Java技術棧的獨特見解而聞名。 第一輪&#xff1a;Spring與微服務的探索 面試官&#xff1a;“請你談談Spring…

基于vue框架的動物園飼養管理系統a7s60(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表 項目功能&#xff1a;飼養員,健康登記,工作進度,動物信息,進食信息,動物健康,動物醫治,飼料信息,工作留言 開題報告內容 基于Vue框架的動物園飼養管理系統開題報告 一、研究背景與意義 &#xff08;一&#xff09;研究背景 隨著城市化進程加快和公眾對生…

docker鏡像與dockerfile

一、docker鏡像 1.什么是鏡像 容器解決應用開發、測試和部署的問題&#xff0c;而鏡像解決應用部署環境問題。鏡像是一個只讀的容器模板&#xff0c; 打包了應用程序和應用程序所依賴的文件系統以及啟動容器的配置文件&#xff0c;是啟動容器的基礎。鏡像所打 包的文件內容就是…

流媒體基礎解析:音視頻封裝格式與傳輸協議

在視頻處理與傳輸的完整流程中&#xff0c;音視頻封裝格式和傳輸協議扮演著至關重要的角色。它們不僅決定了視頻文件的存儲方式&#xff0c;還影響著視頻在網絡上的傳輸效率和播放體驗。今天&#xff0c;我們將深入探討音視頻封裝格式和傳輸協議的相關知識。 音視頻封裝格式 什…

普中STM32F103ZET6開發攻略(一)

各位看官老爺們&#xff0c;點擊關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 目錄 普中STM32F103ZET6開發攻略 1. GPIO端口實驗——點亮LED燈 1.1 實驗目的 1.2 實驗原理 1.3 實驗環境和器材…

AWS API Gateway 配置WAF(中國區)

問題 需要給AWS API Gateway配置WAF。 AWS WAF設置 打開AWS WAF首頁&#xff0c;開始創建和配置WAF&#xff0c;如下圖&#xff1a; 設置web acl名稱&#xff0c;然后開始添加aws相關資源&#xff0c;如下圖&#xff1a; 選擇資源類型&#xff0c;但是&#xff0c;我這里出…

測試分類詳解

測試分類 一、按測試對象分類 1. 界面測試 1.1 測試內容介紹 界面測試驗證用戶界面(UI)的視覺呈現和交互邏輯&#xff0c;確保符合設計規范并提供良好的用戶體驗。測試內容包括&#xff1a; 頁面布局和元素對齊字體、顏色和圖標一致性交互反饋&#xff08;懸停、點擊狀態&a…

打開NRODIC SDK編譯不過怎么處理,keil與segger studio

打開NRODIC SDK編譯不過怎么處理,以下是keil處理. 1,如圖,不要安裝安裝也不會過 2. 不要安裝點擊否 3.點擊確定后進來這個樣子 4.這里選擇這個勾,OK后就不會再有后面的pack_license 5.去掉勾后這里要選擇自己SDK對應的pack版本,我的是8.27.0 6.OK后彈出個界面也要反復選擇…

HarmonyOS ArkUI-X開發中的常見問題及解決方案

一、跨平臺編譯與適配問題 1. 平臺特定API不兼容 ?問題現象?&#xff1a;使用Router模塊的replaceUrl或startAbility等鴻蒙專屬API時&#xff0c;編譯跨平臺工程報錯cant support crossplatform application。 ?解決方案?&#xff1a; 改用ohos.router的跨平臺封裝API&a…

CSS篇-2

4. position 的值分別是相對于哪個位置定位的&#xff1f; position 屬性是 CSS 布局中一個非常核心的概念&#xff0c;它允許我們精確控制元素在文檔中的定位方式&#xff0c;從而脫離或部分脫離正常的文檔流。理解 position 的不同值以及它們各自的定位基準&#xff0c;是實…

設計模式:觀察者模式 - 實戰

一、觀察者模式場景 1.1 什么是觀察者模式&#xff1f; 觀察者模式&#xff08;Observer Pattern&#xff09;觀察者模式是一種行為型設計模式&#xff0c;用于定義一種一對多的依賴關系&#xff0c;當對象的狀態發生變化時&#xff0c;所有依賴于它的對象都會自動收到通知并更…