數據結構自學Day6 棧與隊列

1. 棧

? ? ? ? 其實棧與隊列仍然屬于線性表(有n個元素構成的集合,邏輯結構呈現線形)

線形表:順序表,鏈表,棧,隊列,串(字符串)

棧(Stack)是一種線性數據結構,進行數據插入和刪除的一段成為棧頂,另外一段稱為棧底,數據元素遵守“后進先出”?(LIFO, Last In First Out)

棧的插入數據 --壓棧/進棧,入數據在棧頂

棧的刪除數據 -- 出棧,出數據也在棧頂。

這里棧如何實現呢?考慮(LIFO: 后進先出)

如果是雙向鏈表的話,無所謂棧頂與棧底的位置。

2. 棧的實現

? ? ? ? 棧的實現利用數組實現提高內存訪問效率

1、棧的初始化? ? ??

typedef int STDataType;
#define Ini_capacity 5typedef struct Stack
{int* _val;int _size;int _capacity;
}Stack;void StackInit(Stack* pst){assert(pst);// pst->_val = NULL;// pst->_capacity = 0;// pst->_size = 0;pst->_val = (STDataType*) malloc(Ini_capacity*sizeof(STDataType));if(pst->_val == NULL){perror("malloc");exit(-1);}pst->_size = 0;pst->_capacity =Ini_capacity;}

2、壓棧(入棧操作)

// 入棧
void StackPush(Stack* pst,STDataType Val){assert(pst);if(pst->_size == pst->_capacity){//增容pst->_capacity = 2*pst->_capacity;STDataType* tmp = realloc(pst->_val,pst->_capacity*sizeof(STDataType));pst->_val = tmp;tmp = NULL;}pst->_val[pst->_size] = Val;pst->_size++; 
}

3、出棧操作

void StackPop(Stack* pst){assert(pst && pst->_size > 0);--pst->_size;
}

4 、返回棧內數據個數,是否為空,以及棧頂元素

//獲取數據個數
int StackSize(Stack* pst){assert(pst);return(pst->_size);
}
//返回1 是空,返回0是非空
int StackEmpty(Stack* pst){assert(pst);// return pst->_size == 0 ? 1 : 0;return !pst->_size;
}
//獲取棧頂數據 
STDataType StackTop(Stack* pst){assert(pst && pst->_size>0);return pst->_val[pst->_size-1];
}

5、棧的摧毀,釋放空間

//棧的摧毀
void StackDestroy(Stack* pst){assert(pst);free(pst->_val);pst->_val = NULL;pst->_size =pst->_capacity = 0;
}

3、棧的常見應用:

  • 1、函數調用(函數棧幀)

  • 2、括號匹配(如表達式合法性)

  • 3、 瀏覽器歷史記錄(后退/前進)

  • 4、深度優先搜索(DFS)迷宮問題

4、隊列

????????隊列(Queue)是一種線性數據結構:一個典型的隊列有兩個端:Front(隊首):元素被取出的地方 Rear(隊尾):元素被加入的地方。它的特點是:先進先出(FIFO, First In First Out)。

同樣,隊列的實現也可以通過數組和鏈表進行實現。?考慮(FIFO: 后進先出)。

數列出隊列有些麻煩:需要挪動數據,因為隊頭的數據出隊列后,隊尾數據需要補充。

單鏈表入隊列只需要尾插,出隊列只需要將頭節點給到下一個節點,然后free即可。

5、隊列的實現

? ? ? ?隊列的實現利用單向鏈表

1、隊列的初始化 (保存隊列的頭指針,尾指針)

//利用單向鏈表的形式實現棧
typedef int QeDataType;typedef struct QueueNode
{QeDataType _data;struct QueueNode* next;
}QueueNode;
//存儲隊列的頭,尾指針用于插入和刪除隊列元素
typedef struct Queue
{QueueNode* _head;QueueNode* _tail;
}Queue;//隊列的初始化
void QueueInit(Queue* pq){assert(pq);pq->_head = pq->_tail = NULL;
}

2、隊列新增元素

//隊列插入元素
void QueuePush(Queue* pq, QeDataType x){assert(pq);QueueNode*NewNode = (QueueNode*)malloc(sizeof(QueueNode));if(NewNode == NULL){perror("malloc");exit(-1);}NewNode->next=NULL;NewNode->_data = x;if(pq->_head == NULL){pq->_head = pq->_tail = (QueueNode*)malloc(sizeof(QueueNode));}else{pq->_tail->next = NewNode;pq->_tail = NewNode;}
}

3、隊列刪除元素

//隊列刪除元素
void QueuePop(Queue* pq){assert(pq);if(pq->_head == NULL){printf("隊列為空\n");exit(-1);}QueueNode* head_next = pq->_head->next;free(pq->_head);pq->_head = head_next;if(pq->_head == NULL){pq->_tail = NULL;}
}

4、取出隊列頭數據和尾數據

//取出隊頭數據
QeDataType QueueFront(Queue* pq){assert(pq);if(pq->_head ==NULL){return NULL;}return pq->_head->_data;
}
//取出隊尾數據
QeDataType QueueBack(Queue* pq){assert(pq);if(pq->_tail ==NULL){return NULL;}return pq->_tail->_data;
}

5、檢查隊列是否為空,返回隊列大小

//檢查隊列是否為空,返回隊列大小
int QueueEmpty(Queue* pq){assert(pq);return !pq->_head;
}
int QueueSize(Queue* pq){assert(pq);if(pq == NULL){return 0;}QueueNode* Cur = pq->_head;int count =0;while(Cur || Cur != pq->_tail) {count++;Cur = Cur->next;}return count;
}

6、隊列的常見應用

應用場景

描述

操作系統調度

CPU 任務調度用就緒隊列

消息隊列系統

線程/服務之間的數據傳輸

廣度優先搜索(BFS)

圖的遍歷

打印任務排隊

打印服務器依次處理任務

緩存機制(例如先進先出緩存)

維護歷史數據

銀行/售票排隊系統

模擬現實中等待排隊的流程

棧與隊列,是程序運行背后的“隱形骨架”,掌握它們,你就掌握了高效處理順序、回退、排隊等核心能力,是走向算法高手的第一步。

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

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

相關文章

Java 異常處理詳解:從基礎語法到最佳實踐,打造健壯的 Java 應用

作為一名 Java 開發工程師,你一定遇到過運行時錯誤、空指針異常、文件找不到等問題。Java 提供了強大的異常處理機制,幫助我們優雅地捕獲和處理這些錯誤。本文將帶你全面掌握:Java 異常體系結構try-catch-finally 的使用throw 與 throws 的區…

Fiddler弱網測試實戰指南

Fiddler是一個常用的網絡抓包工具,它也可以用來模擬弱網環境進行測試。 在測試時需要用到弱網測試,也就是在信號差、網絡慢的情況下進行測試。比如,用戶在地鐵、電梯、地下車庫等場景經常會遇到會話中斷、超時等情況,這種就屬于弱…

解決Vue頁面黑底紅字遮罩層報錯:Unknown promise rejection reason (webpack-internal)

vue前端頁面彈出黑底紅色報錯遮罩層報錯:具體報錯信息:Uncaught runtime errors: ERROR Unknown promise rejection reasonat handleError (webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:299:58)at eval (webpack-internal…

構建 Go 可執行文件鏡像 | 探索輕量級 Docker 基礎鏡像(我應該選擇哪個 Docker 鏡像?)

文章目錄構建 Go 可執行文件鏡像典型用途探索輕量級 Docker 基礎鏡像構建 Go 可執行文件鏡像 golang:1.23.0-bullseye 是官方 Go 鏡像的一個 “build-stage” 版,用來構建 Go 可執行文件,而不是把它當成最終運行鏡像。 dockerhub官方:https://hub.dock…

鏈表算法之【回文鏈表】

目錄 LeetCode-234題 LeetCode-234題 給定一個單鏈表的頭節點head,判斷該鏈表是否為回文鏈表,是返回true,否則返回false class Solution {/*** 這里的解題思路為:* (1)、找中間節點* (2)、反轉鏈表* (3)、遍歷比較節點值是否相…

Playwright Python 教程:網頁自動化

1. 常用工具簡介及對比主流網頁自動化工具對比工具支持語言瀏覽器支持特點適用場景PlaywrightPython, JS, .NETChromium, Firefox, WebKit跨瀏覽器、速度快、API簡潔自動化測試、爬蟲、網頁操作Selenium多語言所有主流瀏覽器歷史悠久、社區大傳統自動化測試、兼容性測試Puppete…

動態數組:ArrayList的實現原理

動態數組:ArrayList的實現原理 大家好!今天我們來聊聊Java集合框架中一個非常重要的數據結構——ArrayList。就像我們日常生活中使用的伸縮收納盒一樣,ArrayList可以根據需要自動調整大小,既方便又高效。那么它是如何實現這種&quo…

MIPI DSI(五) DBI 和 DPI 格式

關于 DBI 和 DPI 這兩種格式的詳細協議內容,請參考《MIPI Alliance Standard for Display Bus Interface(V2.0) .pdf》和《MIPI Alliance Standard for Display Pixel Interface(DPI- 2) .pdf》這兩份文檔。首先先了解…

FRP Ubuntu 服務端 + MacOS 客戶端配置

一、服務端配置 1、下載frp并解壓 # 創建目錄并進入 mkdir -p /opt/frp && cd /opt/frp # 下載最新版(替換URL為GitHub發布頁最新版本) wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz # 解壓 …

Video Python(Pyav)解碼二

在 PyAV 中,input_container.decode() 和 input_container.demux() 是兩種處理視頻流數據的不同方法,它們分別適用于不同的場景。下面通過代碼示例和對比來詳細說明它們的用法和區別。1. input_container.decode()功能直接解碼:從容器中讀取數…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第十六課——圖像五行緩存的FPGA實現

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

頭文件與源文件及區別

使用場景上的區別頭文件:變量的聲明,函數的聲明,宏的定義,類的定義等。 源文件:變量的定義。函數的定義實現,類成員函數的定義實現等。這樣方便于我們去管理、規劃,更重要的是避免了重定義的問題…

圖機器學習(4)——圖機器學習與嵌入算法

圖機器學習(4)——圖機器學習與嵌入算法0. 前言1. 圖機器學習1.1 機器學習基本原理1.2 圖機器學習的獨特優勢2. 廣義圖嵌入問題3. 圖嵌入算法分類小結0. 前言 機器學習是人工智能的一個重要分支,它致力于讓系統能夠從數據中自主學習并持續優…

網絡基礎10--ACL與包過濾

一、ACL 定義與核心功能ACL(訪問控制列表)是通過規則匹配實現數據包過濾或分類的核心技術,廣泛應用于包過濾、NAT、QoS、路由策略等場景。其核心由規則條目組成,每條規則包含匹配條件(如源 / 目 IP、端口、協議&#x…

Web安全 - 基于 SM2/SM4 的前后端國產加解密方案詳解

文章目錄概述一、背景與法規要求二、算法選型三、核心流程四、前端實現要點(偽代碼)五、后端實現要點(偽代碼)六、公鑰存儲策略七、全流程示例圖八、總結與最佳實踐推薦概述 隨著信息安全法規日益嚴格,如《網絡安全法》《數據安全法》和等保…

ACL動態路由實驗全攻略:配置與安全實戰

實驗拓撲圖 實驗需求 步驟1.按照圖示配置IP地址2.按照圖示區域劃分配置對應的動態路由協議3.在R7上配置dhcp服務器,能夠讓pc可以獲取IP地址4.將所有環回宣告進ospf中,將環回17宣告進rip中,將rip路由引rospf中,ospf路由引.rip中5.要…

電動汽車制動系統及其工作原理

制動系統是實現車輛減速、停車功能的重要系統。電動汽車的制動系統按照制動實現方式分為機械制動和電機再生制動,機械制動根據制動力實現方式不同又可分為液壓機械制動系統、氣壓機械制動系統和電子機械制動系統。目前,電動汽車的制動系統實現一般為協調…

CentOS 7 Linux 離線安裝 docker-compose

CentOS 7 Linux 離線安裝 docker-compose 1. docker-compose 簡介 1.1. docker-compose 是什么? docker-compose 是 Docker 官方提供的工具,用于定義和運行多容器 Docker 應用程序。通過一個 YAML 文件(通常為 docker-compose.yml&#xf…

排序算法實戰(上)

一、引言在力扣刷題的旅程中,排序類題目是繞不開的重要板塊。今天就來分享兩道經典排序題——912. 排序數組和75. 顏色分類的解題思路與代碼實現,帶你深入理解排序算法在實際題目中的應用 。二、題目剖析與解題思路(一)912. 排序數…

python學智能算法(二十)|SVM基礎概念-感知機算法及代碼

引言 前序學習進程中,已經學習了超平面的基礎知識,學習鏈接為:超平面 在此基礎上,要想正確繪制超平面,還需要了解感知機的相關概念。 感知機 感知機是對生物神經網絡的模擬,當輸入信號達到感知機的閾值時…