棧和隊列:數據結構中的基礎與應用?

棧和隊列:數據結構中的基礎與應用

請添加圖片描述

在計算機科學的領域中,數據結構猶如大廈的基石,支撐著各類復雜軟件系統的構建。而棧和隊列作為兩種基礎且重要的數據結構,以其獨特的特性和廣泛的應用,在程序設計的舞臺上扮演著不可或缺的角色。

棧:“后進先出” 的存儲容器

棧是一種特殊的線性表,其特殊性體現在操作的局限性上。它只允許在固定的一端進行數據的插入和刪除操作,這一端被稱為棧頂,另一端則是棧底 。這種操作限制使得棧呈現出 “先進后出”(LIFO,Last In First Out)的邏輯特性。在日常生活中,棧的身影隨處可見。比如堆疊的盤子,我們總是先取用最后放上去的盤子;函數調用時,最后調用的函數會最先返回;在文檔編輯軟件中,撤銷操作也是按照最近的修改最先被撤銷的順序進行 。

從實現方式來看,棧主要有順序棧和鏈式棧兩種。順序棧基于順序表實現,利用連續的內存空間來存儲元素,并通過管理結構體記錄棧的狀態,如棧的總容量、棧頂下標等。鏈式棧則借助單鏈表實現,每個鏈表節點存儲一個元素,同樣有管理結構體來維護棧頂指針、當前元素個數以及棧容量限制等信息 。

以順序棧的操作為例,初始化棧時,需要為存儲元素的數組分配內存空間,并將棧頂下標初始化為 -1,表示空棧。入棧操作時,首先判斷棧是否已滿,若未滿,則將棧頂下標加 1,然后在對應的數組位置存儲新元素。出棧操作則先檢查棧是否為空,若不為空,先獲取棧頂元素,再將棧頂下標減 1 。相關代碼實現如下:

// 順序棧結構體
typedef struct node {DATA *stack; // 存儲元素的數組首地址int size; // 棧的總容量int top; // 棧頂下標(初始為-1表示空棧)
}SeqStack;// 初始化棧
int sstack_init(SeqStack *s, int num) {s->data = (DATA *)calloc(num, sizeof(DATA));if(s->data == NULL) return -1;s->size = num;s->top = -1; return 0;
}// 數據入棧/壓棧
int sstack_push(SeqStack *s, DATA data) {if(sstack_isfull(s)) return -1;s->top++; s->data[s->top] = data; return 0;
}// 數據出棧/彈棧
int sstack_pop(SeqStack *s, DATA *data) {if(sstack_isempty(s)) return -1;*data = s->data[s->top];s->top--;return 0;
}

棧的優點顯著,操作簡單高效,由于僅對棧頂進行操作,其時間復雜度為 O (1) 。并且,“后進先出” 的特性使其在處理對稱性、嵌套性問題時得心應手。例如在表達式求值(中綴轉后綴)和括號匹配檢查中,棧能夠有效地解決這些問題。然而,棧也存在一定的局限性,它只能直接訪問棧頂元素,順序棧還存在容量限制,而鏈式棧則有額外的指針開銷 。

棧在實際應用中十分廣泛。在函數調用過程中,系統會利用棧來保存函數調用的相關信息,如返回地址、局部變量等,確保函數能夠正確地返回和執行 。在瀏覽器的前進后退功能中,同樣運用了棧的原理,用戶訪問過的頁面地址被依次壓入棧中,通過對棧的操作實現前進和后退的功能 。

隊列:“先進先出” 的有序序列

隊列同樣是一種特殊的線性表,它的特殊之處在于只能在固定的兩端進行操作,一端用于插入元素,稱為隊尾;另一端用于刪除元素,稱為隊頭 。這種操作方式使得隊列呈現出 “先進先出”(FIFO,First In First Out)的特性,與現實生活中的排隊現象極為相似。例如在銀行排隊辦理業務,先來的客戶先接受服務;打印隊列中,先提交的文檔先被打印;消息隊列里,先到達的消息先被處理 。

隊列的存儲實現主要有循環隊列和鏈式隊列。循環隊列基于數組實現,通過巧妙的模運算實現了數組空間的循環利用。為了區分隊空和隊滿的狀態,通常會犧牲一個存儲單元 。鏈式隊列則借助鏈表節點存儲元素,通過維護隊頭指針和隊尾指針來管理隊列 。

以循環隊列的操作為例,初始化循環隊列時,需要為存儲數組分配內存空間,并將隊頭下標和隊尾下標都初始化為 0 。入隊操作時,先判斷隊列是否已滿,若未滿,則在隊尾下標對應的數組位置存儲新元素,然后更新隊尾下標 。出隊操作則先檢查隊列是否為空,若不為空,先獲取隊頭元素,再更新隊頭下標 。相關代碼實現如下:

// 循環隊列結構體
typedef struct {DATA *data; // 存儲數組int size; // 隊列容量int front; // 隊頭下標(出隊維護隊頭下標)int rear; // 隊尾下標(入隊維護隊尾下標)
}SQueue;// 初始化循環隊列
int squeue_init(SQueue *q, int size) {q->data = (DATA *)calloc(size, sizeof(DATA));if (q->data == NULL)return -1;q->size = size;q->front = q->rear = 0;return 0;
}// 元素入隊
int squeue_enqueue(SQueue *q, DATA data) {if (squeue_isfull(q))return -1;q->data[q->rear] = data;q->rear = (q->rear + 1) % q->size; return 0;
}// 元素出隊
int squeue_dequeue(SQueue *q, DATA *data) {if (squeue_isempty(q))return -1;*data = q->data[q->front];q->front = (q->front + 1) % q->size;return 0;
}

隊列的優點在于 “先進先出” 的特性保證了操作的公平性,并且支持高效的隊頭和隊尾操作 。循環隊列在訪問速度上具有優勢,適合固定大小場景;鏈式隊列則能動態擴容,適用于大小不確定的場景 。但隊列也有其缺點,它只能直接訪問隊頭和隊尾元素,循環隊列還存在固定容量限制 。

隊列在眾多領域有著廣泛的應用。在任務調度中,如打印隊列,能夠按照任務提交的先后順序依次執行任務 。在消息隊列中,確保消息按照到達的先后順序被處理,避免消息混亂 。在廣度優先搜索(BFS)算法中,隊列用于存儲待訪問的節點,保證了搜索的廣度優先特性 。在緩沖池管理和多線程編程中的生產者 - 消費者模式中,隊列也發揮著重要作用,實現了數據的有序傳遞和共享 。

亂 。在廣度優先搜索(BFS)算法中,隊列用于存儲待訪問的節點,保證了搜索的廣度優先特性 。在緩沖池管理和多線程編程中的生產者 - 消費者模式中,隊列也發揮著重要作用,實現了數據的有序傳遞和共享 。

棧和隊列作為基礎的數據結構,雖然看似簡單,卻蘊含著強大的功能和廣泛的應用價值。它們為解決各種復雜的編程問題提供了有效的工具和思路,無論是在系統軟件的底層實現,還是在應用軟件的功能開發中,都占據著舉足輕重的地位 。深入理解和熟練運用棧和隊列,將為我們在計算機科學的道路上奠定堅實的基礎 。

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

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

相關文章

服務端配置 CORS解決跨域問題的原理

服務端配置 CORS(跨域資源共享)的原理本質是 瀏覽器與服務器之間的安全協商機制。其核心在于服務器通過特定的 HTTP 響應頭聲明允許哪些外部源(Origin)訪問資源,瀏覽器根據這些響應頭決定是否放行跨域請求。以下是詳細…

Unity筆記(五)知識補充——場景切換、退出游戲、鼠標隱藏鎖定、隨機數、委托

寫在前面:寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。主要是C#代碼部分。十七、場景切換和退出游戲1、場景切換場景切換使用方法: SceneManager.LoadScene()&a…

用 Spring 思維快速上手 DDD——以 Kratos 為例的分層解讀

用 Spring 思維理解 DDD —— 以 Kratos 為參照 ? 在此前的學習工作中,使用的開發框架一直都是 SpringBoot,對 MVC 架構幾乎是肌肉記憶:Controller 接請求,Service 寫業務邏輯,Mapper 操作數據庫,這套套路…

docspace|Linux|使用docker完全離線化部署onlyoffice之docspace文檔協作系統(全網首發)

一、 前言 書接上回,Linux|實用工具|onlyoffice workspace使用docker快速部署(離線和定制化部署)-CSDN博客,如果是小公司或者比如某個項目組內部使用,那么,使用docspace這個文檔協同系統是非常合適的&…

【教程】如何高效提取胡蘿卜塊根形態和顏色特征?

胡蘿卜是全球不可或缺的健康食材和重要的經濟作物, 從田間到餐桌,從鮮食到深加工,胡蘿卜在現代人的飲食和健康中扮演著極其重要的角色,通過量化塊根形態和色澤均勻性,可實現對高產優質胡蘿卜品種的快速篩選。工具/材料…

Python初學者筆記第二十四期 -- (面向對象編程)

第33節課 面向對象編程 1. 面向對象編程基礎 1.1 什么是面向對象編程面向過程:執行者 耗時 費力 結果也不一定完美 面向對象:指揮者 省時 省力 結果比較完美面向對象編程(Object-Oriented Programming, OOP)是一種編程范式,它使用"對象&…

Go 語言 里 `var`、`make`、`new`、`:=` 的區別

把 Go 語言 里 var、make、new、: 的區別徹底梳理一下。1?? var 作用:聲明變量(可以帶初始值,也可以不帶)。語法: var a int // 聲明整型變量,默認值為 0 var b string // 默認值 ""…

計算機網絡---IP(互聯網協議)

一、IP協議概述 互聯網協議(Internet Protocol,IP)是TCP/IP協議族的核心成員,位于OSI模型的網絡層(第三層),負責將數據包從源主機傳輸到目標主機。它是一種無連接、不可靠的協議,提供…

DataFun聯合開源AllData社區和開源Gravitino社區將在8月9日相聚數據治理峰會論壇

🔥🔥 AllData大數據產品是可定義數據中臺,以數據平臺為底座,以數據中臺為橋梁,以機器學習平臺為中層框架,以大模型應用為上游產品,提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xff…

【工具】通用文檔轉換器 推薦 Markdown 轉為 Word 或者 Pdf格式 可以批量或者通過代碼調用

【工具】通用文檔轉換器 推薦 可以批量或者通過代碼調用 通用文檔轉換器 https://github.com/jgm/pandoc/ Pandoc - index 下載地址 https://github.com/jgm/pandoc/releases 使用方法: 比如 Markdown 轉為 Word 或者 Pdf格式 pandoc -s MANUAL.txt -o example29.docx …

【UEFI系列】Super IO

文章目錄一、什么是Super IO二、Super IO的作用常見廠商三、邏輯設備控制如何訪問SIO邏輯設備的配置寄存器具體配置數值四、硬件監控(hardware monitor)一、什么是Super IO Super Input/Output超級輸入輸出控制器。 通過LPC(low pin count&a…

飛算 JavaAI 2.0.0 測評:自然語言編程如何顛覆傳統開發?

一、前言 在AI技術高速發展的今天,編程方式正在經歷一場革命。傳統的“手寫代碼”模式逐漸被AI輔助開發取代,而飛算JavaAI 2.0.0的推出,更是讓自然語言編程成為現實。 作為一名長期使用Java開發的程序員,我決定深度體驗飛算Java…

Dubbo + zk 微服務

一、安裝zk注冊中心 win版本:windows環境下安裝zookeeper教程詳解(單機版)-CSDN博客 linux版本: 二、服務提供方搭建 引入dubbo和zk依賴 提供接口 使用注解方式實現接口級注冊到zk,而springcloud是將服務注冊到注冊…

聆思duomotai_ap sdk適配dooiRobot

一、說明 1、duomotai_ap介紹 duomotai_ap是一個針對多模態開發板(如 CSK6-MIX 開發板)的大模型 AI 開發套件 SDK,主要用于開發語音、視覺等多模態 AI 應用。 2、dooiRobot介紹 基于Doly 機器人的經典外觀設計,采用聆思CSK6011A…

Photoshop軟件打開WebP文件格的操作教程

Photoshop軟件打開WebP文件格的操作教程,好吧,這是英文原版: Photoshop 23.2 原生支持 WebP 格式,無需插件即可打開、編輯和保存 WebP 文件。用戶可通過“文件 > 另存為副本”選擇 WebP 格式,調整無損/有損壓縮及質…

【數據結構】——順序表鏈表(超詳細解析!!!)

目錄一. 前言二. 順序表1. 順序表的特點2. 代碼實現三. 鏈表1. 單向鏈表代碼實現2.雙向鏈表代碼實現四. 順序表與鏈表的區別總結一. 前言 順序表和鏈表是最基礎的兩種線性表實現方式。它們各有特點,適用于不同的應用場景。本文將詳細介紹這兩種數據結構的實現原理、…

GitHub的簡單使用方法----(4)

在安裝完git之后,桌面右鍵會出現兩個git的選項第一個gui打開是這樣的用戶界面分別是新建倉庫,克隆倉庫,打開已經存在的倉庫。tips:Git Gui 默認只能操作本地倉庫——它本質上是一個圖形化的“本地 Git 客戶端”。 它本身不內置“下載遠程倉庫…

藍橋杯----大模板

在寫大模板之前,先講一個函System_Init(),用于系統初始化關閉所有LED與外設,關閉所有LED就是傳入0xff數據打開鎖存器,關閉外設就是傳入0x00打開鎖存器。現在所有底層已經提供給大家了,先提供最簡單版本的大模板&#x…

科技寫作改革我見:取消參考文獻,以點讀率取代引證率!

科技寫作改革我見:綜述應取消參考文獻,學術成就評估以點讀下載率取代參考文獻引證率!李升偉 張君飛 韓若蘭引言在當今信息爆炸的時代,科技寫作作為知識傳播的核心載體,其形式與評價體系正面臨前所未有的挑戰。傳統…

【Altium designer】快速建立原理圖工程的步驟

快速建立原理圖工程的步驟產品規格書分析 整理產品需求,明確主控芯片、外圍接口類型、總線頻率、電源需求及隔離要求、PCB尺寸等關鍵信息。使用文本清單列出所有需求,確保無遺漏。硬件需求架構圖繪制 根據需求說明書和收集的信息,使用VISIO繪…