【日擼 Java 300行】Day 14(棧)

目錄

Day 14:棧

一、棧的基本知識

二、棧的方法

1. 順序表實現棧

2. 入棧

3. 出棧?

三、代碼及測試

拓展:

小結?


Day 14:棧

Task:

  • push 和 pop 均只能在棧頂操作.
  • 沒有循環, 時間復雜度為 O(1).

一、棧的基本知識

? ? ? ? 詳細的介紹,可以參考這篇學習筆記:【數據結構】棧-CSDN博客。本博文中只選取部分知識點講解。

? ? ? ? 簡單來說,我們可以把棧理解成一種 “運算受限” 的線性表,即后進先出(Last In First Out,簡稱LIFO)或先進后出(First In Last Out,簡稱FILO)的原則進行的線性表,因此,棧又稱為LIFO表或FILO表。

? ? ? ? 對于棧這種數據結構的定位,我們可以從棧這個字本身出發。
????????“ 棧 ”是一個用于存儲貨物的房間,就像我們古代用于旅人駐腳歇店的客棧,人們不會在這久居,不過是中轉站罷了。

????????這個翻譯可謂很靈性了,計算機中的“ 棧 ”(Stack)也確實也可以理解為暫時存儲的容器。比如在函數調用時,底層編譯器會把我們當前的數據放于這個臨時的容器中存儲,避免在進入函數后當前上下文環境的信息丟失,之后,待到函數返回后再從Stack中取出。

????????當然,這種數據中轉存儲的數據類型我們不是說都稱之為棧,還包括有有隊列性質的高速緩存與各種正常的順序存儲的文件系統等,只是說棧有些獨有方面的特例。

二、棧的方法

1. 順序表實現棧

????????同時需要注意的一點,根據線性表的分類(順序表和鏈表)?,我們可以用這兩種方式來實現棧的構建,即分為順序棧和鏈棧。本博文中通過順序表來實現棧,具體構造原理可以參考學習筆記,這里不做展開。

	/*** The depth.*/public static final int MAX_DEPTH = 10;/*** The actual*/int depth;/*** The data*/char[] data;/************************ Construct an empty char stack.**********************/public CharStack() {depth = 0;data = new char[MAX_DEPTH];}// Of the first constructor/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {String resultString = "";for (int i = 0; i < depth; i++) {resultString += data[i];} // Of for ireturn resultString;}// Of toString

????????這里的屬性與靜態順序表中的內容無差,構造函數完成棧深度(長度)初始化,空間開辟遵循靜態鏈表開辟的方法——使用new開辟固定“MAX_DEPTH”大小的空間。

????????但注意,棧是于棧頂一端進行刪除與插入的結構,而為了順序表的實現方便,我們往往在下標較大處插入,因此我們定義棧頂在數組的最右側
????????所以,按照從左向右打印的習慣,toString()函數完成的就是棧底向棧頂的打印過程。

2. 入棧

????????本質上就是加入一個元素,只不過位置被限定在棧頂。
????????從順序表的角度來看,其意義就是在順序表的最后一個元素后面再插入一個元素。
? ? ? ? 由于位置固定,所以我們只需要給末尾元素之后的空位賦值并且讓棧深度+1即可(對于從0開始記錄的任何表,表長都默認值最后一個元素的下一個位置)

	/************************ Push an element.* * @param paraChar The given char.* @return Success or not.**********************/public boolean push(char paraChar) {if (depth == MAX_DEPTH) {System.out.println("Stack full.");return false;} // Of ifdata[depth] = paraChar;depth++;return true;}// Of push

????????對于任何順序表的插入都不要忘記判斷表滿的情況,因此,這里先進行一次判滿的判斷,這是棧的基本健壯性保證。
????????之后的入棧操作怎么寫,要根據你的棧頂指針的默認指向來確定。
????????這里我們用depth來表示棧深度,同時,自然也用于表示棧頂指針。這種情況的話,depth默認指向的位置剛好就是尾元素后面的空位,剛好可以直接插入,于是可以使用:

		data[depth] = paraChar;depth++;

????????我們可以做如下簡寫:

        data[depth++] = paraChar;

?????????當然,若棧頂指針假設指向末尾元素本身的話,這里我們假設這個變量為top。在插入元素時需要保證棧頂指針要先移動到末尾元素后面的空位才能進行插入,于是就要使用:

		top++;data[top] = paraChar;

? ? ? ? ?當然,也可以簡寫成:

        data[++top] = paraChar;

????????習慣上,我們會將入棧操作定義為 Boolean 類型,這是因為布爾信息能夠明確的告訴我們該操作是否成功。

3. 出棧?

? ? ? ? 同順序表一樣,元素刪除需要先判斷是否為空,以保證程序的健壯性。
????????出棧時,使用resultChar先接收棧頂數據,之后再進行棧指針的下移操作,實現邏輯上元素減少(但是實際上這個值還是存放在原指針所指的位置的),因為我們確定棧元素的多少僅依靠棧頂指針的具體值而定。

????????這個操作與入棧的操作是完全相逆的,而且也會因為棧頂指針的含義不同而變化,即:棧頂指針指向棧頂有效元素的上方的一個無數據位,一般我們令其值為 -1。由于這里我們采用的是 depth(深度),所以最小值為0,但觀察可知,實際操作中讀取的 depth - 1,是等效的。

	public char pop() {if (depth == 0) {System.out.println("Nothing to pop.");return '\0';} // Of ifchar resultChar = data[depth - 1];depth--;return resultChar;}// Of pop

三、代碼及測試

package datastructure.stack;/*** Char stack. I do not use Stack because it is already defined in Java.** @author: Changyang Hu joe03@foxmail.com* @date created: 2025-05-13*/
public class CharStack {/*** The depth.*/public static final int MAX_DEPTH = 10;/*** The actual depth.*/int depth;/*** The data*/char[] data;/************************ Construct an empty char stack.**********************/public CharStack() {depth = 0;data = new char[MAX_DEPTH];}// Of the first constructor/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {String resultString = "";for (int i = 0; i < depth; i++) {resultString += data[i];} // Of for ireturn resultString;}// Of toString/*** ********************** @Title: push* @Description: Push an element.** @param paraChar The given char.* @return Success or not.* @return boolean **********************/public boolean push(char paraChar) {if (depth == MAX_DEPTH) {System.out.println("Stack full.");return false;} // Of ifdata[depth] = paraChar;depth++;return true;}// Of push/*** ********************** @Title: pop* @Description: Pop an element.** @return The popped char.* @return char **********************/public char pop() {if (depth == 0) {System.out.println("Nothing to pop.");return '\0';} // Of ifchar resultChar = data[depth - 1];depth--;return resultChar;}// Of pop/*** ********************** @Title: main* @Description: The entrance of the program.** @param args Not used now.* @return void **********************/public static void main(String args[]) {CharStack tempStack = new CharStack();for (char ch = 'a'; ch < 'm'; ch++) {tempStack.push(ch);System.out.println("The current stack is: " + tempStack);} // Of for chchar tempChar;for (int i = 0; i < 12; i++) {tempChar = tempStack.pop();System.out.println("Poped: " + tempChar);System.out.println("The current stack is: " + tempStack);} // Of for i}// Of main}// Of CharStack

拓展:

? ? ? ? 棧:【數據結構】棧-CSDN博客


小結?

? ? ? ? 通過順序表來實現棧操作,本身并不復雜,只是說一些要點需要我們在使用前就想好:

  • 采用 depth(指向棧頂的下一個元素)還是 top(指向棧頂)作為下標
  • 采用順序表來實現還是鏈表(鏈表相關參考學習筆記)

? ? ? ? 棧雖然本身簡單,但是其在數據傳輸中的戰略地位極高。?

? ? ? ? 棧實現了“ 調用 ”思想的核心。棧的臨時存儲與棧出數據總是最近一次棧入的數據的特性非常符合嵌套調用與返回的特性。所以如今我們使用的各種函數都用到了棧的思想,任何使用函數完成的算法體系都可以使用棧完成模擬。

????????棧貫穿了計算機的各個鄰域,棧的概念在硬件中就早有使用,因為棧的實現,促成了操作系統的中斷特性的實現,而中斷的特性又促成后來批處理操作系統的誕生,是當代計算機的奠基石。也許毫不夸張說,沒有棧,就沒有我們如今的計算機的基礎。

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

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

相關文章

dotnet core c#調用Linux c++導出函數

1.聲明C++導出函數 platform_export.h // // Created by dev on 5/6/25. //#ifndef PLATFORM_EXPORT_H #define PLATFORM_EXPORT_H #if defined(_WIN32)#ifdef LIB_EXPORTS#define LIB_API __declspec(dllimport)#else#define LIB_API __declspec(dllimport)#endif #else#ifde…

SparkSQL操作Mysql

前面的課程我們學習了如何從csv文件中讀入數據&#xff0c;這相當于是對csv這種類型的數據的操作。那么接下來&#xff0c;我們一起看看&#xff0c;如何寫Spark程序來操作mysql數據庫。先來給大家介紹一下我們這節課的主要學習內容&#xff1a; &#xff08;1&#xff09;安裝…

語言學中的對象語言與元語言 | 概念 / 區別 / 實例分析

注&#xff1a;英文引文&#xff0c;機翻未校。 語言學中的“對象語言”和“元語言” 劉福長 現代外語 1989年第3期&#xff08;總第45期&#xff09; 在閱讀語言學著作時&#xff0c;我們有時會遇到這樣兩個術語&#xff1a;對象語言&#xff08;object language&#xff0…

livenessProbe 和 readinessProbe 最佳實踐

在 Kubernetes 中&#xff0c;livenessProbe 和 readinessProbe 是確保應用高可用性的關鍵機制&#xff0c;但配置不當可能導致應用頻繁重啟或流量中斷。以下是配置這兩個探針的最佳實踐&#xff1a; 1. 核心區別與作用 探針類型目的失敗后果livenessProbe檢測應用是否 存活&…

集成管理工具Gitlab

GitLab 是一個功能強大的開源代碼托管和協作平臺&#xff0c;集成 GitLab 可以顯著提升團隊的開發效率。下面我將為你介紹如何集成 GitLab&#xff0c;包括安裝配置和基本使用流程。 一、GitLab 安裝與配置 GitLab 有多種安裝方式&#xff0c;推薦使用官方 Omnibus 包安裝&am…

Electron-Vue3、Electron-React、Electron-Angular打造輿情監控系統項目

Electron是一個跨平臺的桌面應用開發框架&#xff0c;可以讓我們用html css js的技術開發跨平臺桌面上可以安裝的軟件。視頻詳解: Electron教程 ElectronVue跨平臺桌面軟件開發教程-2024年更新&#xff08;大地老師&#xff09; 從Electron環境搭建開始到手把手教你調試、Elect…

08.webgl_buffergeometry_attributes_none ,three官方示例+編輯器+AI快速學習

本實例主要講解內容 這個Three.js示例展示了無屬性幾何體渲染技術&#xff0c;通過WebGL 2的gl_VertexID特性和偽隨機數生成算法&#xff0c;在著色器中動態計算頂點位置和顏色&#xff0c;而不需要在CPU端預先定義幾何體數據。 核心技術包括&#xff1a; WebGL 2的頂點ID特…

Ubuntu 22.04搭建OpenStreeMap地址解析服務(保姆級教程)

1.數據準備 1.1.全球數據 下載地址&#xff1a;https://planet.openstreetmap.org/ 1.2.特定區域的數據 下載地址&#xff1a;Geofabrik Download Server 2.安裝必要的軟件包 2.1.更新系統軟件包 sudo apt updatesudo apt upgrade 2.2.安裝所需要的軟件包 執行下面的命…

Ubuntu 22.04.5 LTS上部署Docker及相關優化

以下是在Ubuntu 22.04.5 LTS上部署Docker及相關優化的步驟&#xff1a; 安裝Docker 更新系統&#xff1a;在安裝Docker之前&#xff0c;先確保系統是最新的&#xff0c;執行以下命令&#xff1a;sudo apt update sudo apt upgrade -y安裝依賴包&#xff1a;安裝一些必要的依賴…

React -> AI組件 -> 調用Ollama模型, qwen3:1.7B非常聰明

使用 React 搭建一個現代化的聊天界面&#xff0c;支持與 Ollama 本地部署的大語言模型進行多輪對話。界面清爽、功能完整&#xff0c;支持 Markdown 渲染、代碼高亮、<think> 隱藏思考標簽、流式漸進反饋、暗黑模式適配等特性。 &#x1f9e9; 核心功能亮點 ? 模型選擇…

vue2/3 中使用 @vue-office/docx 在網頁中預覽(docx、excel、pdf)文件

1. 安裝依賴&#xff1a; #docx文檔預覽組件npm install vue-office/docx vue-demi0.14.6#excel文檔預覽組件npm install vue-office/excel vue-demi0.14.6#pdf文檔預覽組件npm install vue-office/pdf vue-demi0.14.6 vue2.6版本或以下還需要額外安裝 vue/composition-api …

【應用密碼學】實驗五 公鑰密碼2——ECC

一、實驗要求與目的 1.復習CCC基本概念&#xff0c;并根據實驗平臺提供的資料完成驗證性實驗。 2.編程練習&#xff1a;以書上例題小模數p為例編程實現ECC的基本運算規則。 二、實驗內容與步驟記錄&#xff08;只記錄關鍵步驟與結果&#xff0c;可截圖&#xff0c;但注意排版…

rust-candle學習筆記9-使用tokenizers加載qwen3分詞,使用分詞器處理文本

參考&#xff1a;about-pytorch&#xff0c; about-tokenizers 在魔搭社區鏈接下載qwen3的tokenizer.json文件 添加依賴庫&#xff1a; cargo add tokenizers tokenizers庫初體驗&#xff1a; use tokenizers::tokenizer::{self, Result, Tokenizer};fn main() -> Resu…

【MySQL】存儲引擎 - ARCHIVE、BLACKHOLE、MERGE詳解

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

5.Redission

5.1 前文鎖問題 基于 setnx 實現的分布式鎖存在下面的問題&#xff1a; 重入問題&#xff1a;重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中&#xff0c;可重入鎖的意義在于防止死鎖&#xff0c;比如 HashTable 這樣的代碼中&#xff0c;他的方法都是使用 sync…

C語言主要標準版本的演進與核心區別的對比分析

以下是C語言主要標準版本的演進與核心區別的對比分析 K&R C&#xff08;1978年&#xff09; 定位?&#xff1a;非標準化的原始版本&#xff0c;由Brian Kernighan和Dennis Ritchie定義 特性?&#xff1a; 基礎語法&#xff1a;函數聲明無參數列表&#xff08;如int func…

【C++設計模式之Template Method Pattern】

C設計模式之Template Method Pattern 模式定義核心思想動機(Motivation)結構&#xff08;Structure&#xff09;實現步驟應用場景要點總結 模式定義 模式定義&#xff1a; 定義一個操作中的算法的骨架(穩定)&#xff0c;而將一些步驟延遲(變化)到子類中。Template Method使得子…

【動態導通電阻】p-GaN HEMTs正向和反向導通下的動態導通電阻

2024 年,浙江大學的 Zonglun Xie 等人基于多組雙脈沖測試方法,研究了兩種不同技術的商用 p-GaN 柵極 HEMTs 在正向和反向導通模式以及硬開關和軟開關條件下的動態導通電阻(RON)特性。實驗結果表明,對于肖特基型 p-GaN 柵極 HEMTs,反向導通時動態 RON 比正向導通高 3%-5%;…

PDFMathTranslate:科學 PDF 文件翻譯及雙語對照工具

PDFMathTranslate&#xff1a;科學 PDF 文件翻譯及雙語對照工具 在科研和學習過程中&#xff0c;我們經常會遇到大量的英文 PDF 文獻&#xff0c;翻譯這些文獻成為了一項繁瑣且耗時的工作。PDFMathTranslate 是一款強大的科學 PDF 文件翻譯及雙語對照工具&#xff0c;它能夠保…

Flutter PIP 插件 ---- 為iOS 重構PipController, Demo界面,更好的體驗

接上文 Flutter PIP 插件 ---- 新增PipActivity&#xff0c;Android 11以下支持自動進入PIP Mode 項目地址 PIP&#xff0c; pub.dev也已經同步發布 pip 0.0.3&#xff0c;你的加星和點贊&#xff0c;將是我繼續改進最大的動力 在之前的界面設計中&#xff0c;還原動畫等體驗一…