棧存儲結構詳解

目錄

棧存儲結構詳解

進棧和出棧

棧的具體實現

棧的應用

什么是隊列(隊列存儲結構)


棧存儲結構詳解

同順序表和鏈表一樣,棧也是用來存儲邏輯關系為 "一對一" 數據的線性存儲結構,如圖 1 所示。


?

棧存儲結構示意圖


圖 1 棧存儲結構示意圖


從圖 1 我們看到,棧存儲結構與之前所學的線性存儲結構有所差異,這緣于棧對數據 "存" 和 "取" 的過程有特殊的要求:

  1. 棧只能從表的一端存取數據,另一端是封閉的,如圖 1 所示;
  2. 在棧中,無論是存數據還是取數據,都必須遵循"先進后出"的原則,即最先進棧的元素最后出棧。拿圖 1 的棧來說,從圖中數據的存儲狀態可判斷出,元素 1 是最先進的棧。因此,當需要從棧中取出元素 1 時,根據"先進后出"的原則,需提前將元素 3 和元素 2 從棧中取出,然后才能成功取出元素 1。


因此,我們可以給棧下一個定義,即棧是一種只能從表的一端存取數據且遵循 "先進后出" 原則的線性存儲結構。

通常,棧的開口端被稱為棧頂;相應地,封口端被稱為棧底。因此,棧頂元素指的就是距離棧頂最近的元素,拿圖 2 來說,棧頂元素為元素 4;同理,棧底元素指的是位于棧最底部的元素,圖 2 中的棧底元素為元素 1。


?

棧頂和棧底


圖 2 棧頂和棧底

進棧和出棧

基于棧結構的特點,在實際應用中,通常只會對棧執行以下兩種操作:

  • 向棧中添加元素,此過程被稱為"進棧"(入棧或壓棧);
  • 從棧中提取出指定元素,此過程被稱為"出棧"(或彈棧);

棧的具體實現

棧是一種 "特殊" 的線性存儲結構,因此棧的具體實現有以下兩種方式:

  1. 順序棧:采用順序存儲結構可以模擬棧存儲數據的特點,從而實現棧存儲結構;
  2. 鏈棧:采用鏈式存儲結構實現棧結構;

兩種實現方式的區別,僅限于數據元素在實際物理空間上存放的相對位置,順序棧底層采用的是數組,鏈棧底層采用的是鏈表。有關順序棧和鏈棧的具體實現會在后續章節中作詳細講解。

棧的應用

基于棧結構對數據存取采用 "先進后出" 原則的特點,它可以用于實現很多功能。

例如,我們經常使用瀏覽器在各種網站上查找信息。假設先瀏覽的頁面 A,然后關閉了頁面 A 跳轉到頁面 B,隨后又關閉頁面 B 跳轉到了頁面 C。而此時,我們如果想重新回到頁面 A,有兩個選擇:

  • 重新搜索找到頁面 A;
  • 使用瀏覽器的"回退"功能。瀏覽器會先回退到頁面 B,而后再回退到頁面 A。


瀏覽器 "回退" 功能的實現,底層使用的就是棧存儲結構。當你關閉頁面 A 時,瀏覽器會將頁面 A 入棧;同樣,當你關閉頁面 B 時,瀏覽器也會將 B入棧。因此,當你執行回退操作時,才會首先看到的是頁面 B,然后是頁面 A,這是棧中數據依次出棧的效果。

不僅如此,棧存儲結構還可以幫我們檢測代碼中的括號匹配問題。多數編程語言都會用到括號(小括號、中括號和大括號),括號的錯誤使用(通常是丟右括號)會導致程序編譯錯誤,而很多開發工具中都有檢測代碼是否有編輯錯誤的功能,其中就包含檢測代碼中的括號匹配問題,此功能的底層實現使用的就是棧結構。

同時,棧結構還可以實現數值的進制轉換功能。例如,編寫程序實現從十進制數自動轉換成二進制數,就可以使用棧存儲結構來實現。

什么是隊列(隊列存儲結構)

隊列,和棧一樣,也是一種對數據的"存"和"取"有嚴格要求的線性存儲結構。

與棧結構不同的是,隊列的兩端都"開口",要求數據只能從一端進,從另一端出,如圖 1 所示:


?

隊列存儲結構


圖 1 隊列存儲結構

通常,稱進數據的一端為 "隊尾",出數據的一端為 "隊頭",數據元素進隊列的過程稱為 "入隊",出隊列的過程稱為 "出隊"。

不僅如此,隊列中數據的進出要遵循 "先進先出" 的原則,即最先進隊列的數據元素,同樣要最先出隊列。拿圖 1 中的隊列來說,從數據在隊列中的存儲狀態可以分析出,元素 1 最先進隊,其次是元素 2,最后是元素 3。此時如果將元素 3 出隊,根據隊列 "先進先出" 的特點,元素 1 要先出隊列,元素 2 再出隊列,最后才輪到元素 3 出隊列。

棧和隊列不要混淆,棧結構是一端封口,特點是"先進后出";而隊列的兩端全是開口,特點是"先進先出"。

因此,數據從表的一端進,從另一端出,且遵循 "先進先出" 原則的線性存儲結構就是隊列。

隊列存儲結構的實現有以下兩種方式:

  1. 順序隊列:在順序表的基礎上實現的隊列結構;
  2. 鏈隊列:在鏈表的基礎上實現的隊列結構;


兩者的區別僅是順序表和鏈表的區別,即在實際的物理空間中,

  1. 數據集中存儲的隊列是順序隊列
  2. 分散存儲的隊列是鏈隊列


實際生活中,隊列的應用隨處可見,比如排隊買 XXX、醫院的掛號系統等,采用的都是隊列的結構。

拿排隊買票來說,所有的人排成一隊,先到者排的就靠前,后到者只能從隊尾排隊等待,隊中的每個人都必須等到自己前面的所有人全部買票成功并從隊頭出隊后,才輪到自己買票。這就不是典型的隊列結構嗎?
?

?

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

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

相關文章

HTML5的介紹和基本框架

目錄 HTML5 HTML5介紹 HTML5的DOCTYPE聲明 HTML5基本骨架 html標簽 head標簽 body標簽 title標簽 meta標簽 在vscode中寫出第一個小框架 HTML5 HTML5介紹 HTML5是用來描述網頁的一種語言,被稱為超文本標記語言。用HTML5編寫的文件,后綴以.ht…

設備加密狗

場景描述 隨著科技的飛速發展,越來越多的智能設備走進生產加工車間。例如智能雕刻機、鈑金機、 榫槽機、鉆孔機、磨刀機等等。 目前市場的智能設備具有一個共同的特點,內置嵌入操作系統,如windows或者linux系統。設備制造商提供智能設備出…

20天學會rust(四)常見系統庫的使用

前面已經學習了rust的基礎知識,今天我們來學習rust強大的系統庫,從此coding事半功倍。 集合 數組&可變長數組 在 Rust 中,有兩種主要的數組類型:固定長度數組(Fixed-size Arrays)和可變長度數組&…

Ajax如何理解

什么是ajax ●認識前后端交互 ○就是 前端 與 后端的 一種通訊方式 ○主要使用的技術棧就是 ajax (async javascript and xml) ●ajax 特點 ○使用 ajax 技術網頁應用能夠快速的將新內容呈現在用戶界面 ○并且不需要刷新整個頁面, 也就是能夠讓頁面有 "無…

Java技術整理(5)—— Spring篇

Spring是一個全面的全面的、企業應用開發一站式的解決方案,貫穿表現層、業務層、持久層。但是 Spring 仍然可以和其他的框架無縫整合。 1、Spring的核心組件 (1)數據層: JDBC、ORM、OXM、JMS、Transations (2&#x…

Flutter 中,ListView 中需要放置 ListView 需要怎么處理才高效?

問題及場景 ListView 是 Flutter 開發者第一個學習到的 Widget,因為它可以滑動。一切都會運行得很好,直到 ListView 中的 Item 本身也是一個 ListView。你可能會看到 Flutter 建議你將內部的 ListView 的ShrinkWrap 屬性設置為 True。雖然錯誤消除了&am…

連續兩年增收不增利,比亞迪電子靠新能源汽車業務再次起飛?

在凈利潤連續兩年下挫之后,比亞迪電子(00285.HK)終于迎來了好消息。 不久前比亞迪電子發布2023年中期盈利預告顯示,上半年凈利潤同比增加115%-146%(2022年上半年的凈利潤顯示6.34億元)。 這主要受益于大客…

包管理工具 nvm npm nrm yarn cnpm npx pnpm詳解

包管理工具 nvm npm yarn cnpm npx pnpm npm、cnpm、yarn、pnpm、npx、nvm的區別:https://blog.csdn.net/weixin_53791978/article/details/122533843 npm、cnpm、yarn、pnpm、npx、nvm的區別:https://blog.csdn.net/weixin_53791978/article/details/1…

【Freertos基礎入門】2個Freertos的Delay函數

文章目錄 前言一、vTaskDelay與vTaskDelayUntil二、示例代碼總結 前言 本系列基于stm32系列單片機來使用freerots 任務管理是實時操作系統(RTOS)的核心功能之一,它允許開發者以并發的方式組織和管理多個任務。FreeRTOS 是一個流行的開源RTO…

嵌入式開發中常用且雜散的命令

1、mount命令 # 掛載linux系統 mkdir /tmp/share mount -t nfs 10.77.66.88:/share/ /tmp/share -o nolock,tcp cd /tmp/share# 掛載Windows系統 mkdir /tmp/windows mount -t nfs 10.66.77.88:/c/public /tmp/windows -o nolock,tcp cd /tmp/windows# 掛載vfat格式的U盤 mkdi…

強訓第32

選擇 D B A A 發送TCP意思應該是已經建立了連接,會超時重傳。在未建立連接的時候,會放棄該鏈接 C A 80端口是http A 交換機攻擊主要有五種:VLAN跳躍攻擊 生成樹攻擊 MAC表洪水攻擊 ARP攻擊 VTP攻擊 B A 2^(32-26)2^(32-27)2^(32-27)128 減去…

基于Java+SpringBoot+Vue+echarts健身房管理系統設計和實現

博主介紹:?全網粉絲30W,csdn特邀作者、博客專家、CSDN新星計劃導師、Java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? 🍅文末獲取源碼聯系🍅 👇🏻 精彩專…

maven Jar包反向install到本地倉庫

maven Jar包反向install到本地倉庫 需求實現 需求 項目打包時報錯,缺少一個jar包。 但是在maven倉庫都找不到此jar包,其他人提供了這個jar包。 需要把這個jar包install到本地倉庫,使項目能正常打包運行。 實現 使用git bash命令執行以下腳…

16.3.4 【Linux】系統資源的觀察

free :觀察內存使用情況 系統當中有 2848MB 左右的實體內存,我的 swap 有 1GB 左右, 那我使用free -m 以 MBytes 來顯示時,就會出現上面的信息。Mem 那一行顯示的是實體內存的量,Swap 則是內存交換空間的量。 total 是…

C++多態

文章目錄 🐵1. 什么是多態🐶2. 構成多態的條件🐩2.1 虛函數🐩2.2 虛函數的重寫🐩2.3 final 和 override關鍵字🐩2.4 重載、重寫、重定義對比 🐱3. 虛函數表🐯4. 多態的原理&#x1f…

神經網絡基礎-神經網絡補充概念-17-計算神經網絡的輸出

計算神經網絡的輸出通常涉及前向傳播(Forward Propagation)的過程,其中輸入數據通過網絡的層級結構,逐步被傳遞并變換,最終生成預測結果。下面我將為你展示一個簡單的神經網絡前向傳播的示例。 假設我們有一個具有以下…

【變形金剛01】attention和transformer所有信息

圖1.來源:Arseny Togulev在Unsplash上的照片 一、說明 這是一篇 長文 ,幾乎討論了人們需要了解的有關注意力機制的所有信息,包括自我注意、查詢、鍵、值、多頭注意力、屏蔽多頭注意力和轉換器,包括有關 BERT 和 GPT 的一些細節。因…

OpenCV圖像處理——輪廓檢測

目錄 圖像的輪廓查找輪廓繪制輪廓 輪廓的特征輪廓面積輪廓周長輪廓近似凸包邊界矩形最小外接圓橢圓擬合直線擬合 圖像的矩特征矩的概念圖像中的矩特征 圖像的輪廓 查找輪廓 binary,contours,hierarchycv.findContours(img,mode,method)繪制輪廓 cv.drawContours(img,coutours…

WSL2安裝Ubuntu,配置機器學習環境

文章目錄 1.WSL2安裝Ubuntu,更改安裝位置,作為開發環境供vscode和pycharm使用:2.更換國內源:3.安裝圖形界面:4.安裝cudacudnntorch5.安裝opencv6.調用攝像頭7.使用yolov8測試 WSL全稱Windows Subsystem for Linux&…

印度貨代專線【我國到印度專線有哪些方式】

隨著全球貿易的不斷發展,我國與印度之間的貿易往來也日益頻繁。作為兩個人口最多的國家之一,中國和印度之間的貨物運輸需求不斷增長。為了滿足這一需求,印度貨代專線應運而生,為進出口商提供高效、可靠的貨物運輸服務。本文將探索…