數據結構:棧和隊列(超詳細)

目錄

?編輯

棧:

棧的概念及結構:

?棧的實現:

隊列:

隊列的概念及結構:

?隊列的實現:

擴展知識:

?以上就是個人學習線性表的個人見解和學習的解析,歡迎各位大佬在評論區探討!

感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!


棧:

棧的概念及結構:

????????棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端 稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。一般用在1.公平性排隊(抽號機);2.BFS(廣度優先遍歷)。

壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。

出棧:棧的刪除操作叫做出棧。出數據也在棧頂。

?棧的實現:

????????棧的實現一般可以使用數組或者鏈表實現,相對而言數組的結構實現更優一些。因為數組在尾上插入數據的代價比較小。鏈的尾插需要調動更多的數據過程中有更多的消耗

// 支持動態增長的棧
typedef int STDataType ;
typedef struct Stack
{
STDataType * _a ;
int _top ; // 棧頂
int _capacity ; // 容量
} Stack ;
// 初始化棧
void StackInit ( Stack * ps );
// 入棧
void StackPush ( Stack * ps , STDataType data );
// 出棧
void StackPop ( Stack * ps );
// 獲取棧頂元素
STDataType StackTop ( Stack * ps );
// 獲取棧中有效元素個數
int StackSize ( Stack * ps );
// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回 0
int StackEmpty ( Stack * ps );
// 銷毀棧
void StackDestroy ( Stack * ps );

?//初始化棧


//初始化
void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}

//入棧

//入棧
void SLPush(SL* ps, STDataType x)
{assert(ps);//棧頂=容量說明需要擴容if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}ps->capacity = newcapacity;ps->a = tmp;}ps->a[ps->top] = x;//后綴++方便下一次入棧和打印棧頂ps->top++;
}

//出棧

//出棧
void SLPop(SL* ps)
{assert(ps);//為空情況“0”assert(ps->top > 0);//--ps->top;
}

//獲得棧頂元素

//獲得棧頂元素
STDataType SLTTop(SL* ps)
{assert(ps);//為空情況“0”assert(ps->top > 0);int n = (ps->top) - 1;return ps->a[n];
}

?//獲取棧中有效元素個數

//獲取棧中有效元素個數
int SLSize(SL* ps)
{assert(ps);return ps->top;
}

//銷毀棧

//銷毀棧
void SLDestroy(SL* ps)
{assert(ps);//開辟數組優勢:一次全部釋放free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}

// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0

// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
bool SLEmpty(SL* ps)
{assert(ps);//為“0”說明為NULLif (ps->top == 0){return true;}return false;
}

隊列:

隊列的概念及結構:

??????? ?隊列: 只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有 先進先出 FIFO(First In First Out) 。
入隊列:進行插入操作的一端稱為隊尾;?
出隊列:進行刪除操作的一端稱為隊頭。

?隊列的實現:

????????隊列也可以數組和鏈表的結構實現,使用鏈表的結構實現更優一些,因為如果使用數組的結構,出隊列在數 組頭上出數據,效率會比較低

// 鏈式結構:表示隊列
typedef struct QListNode
{
struct QListNode * _pNext ;
QDataType _data ;
} QNode ;
// 隊列的結構
typedef struct Queue
{
QNode * _front ;
QNode * _rear ;
} Queue ;
// 初始化隊列
void QueueInit ( Queue * q );
// 隊尾入隊列
void QueuePush ( Queue * q , QDataType data );
// 隊頭出隊列
void QueuePop ( Queue * q );
// 獲取隊列頭部元素
QDataType QueueFront ( Queue * q );
// 獲取隊列隊尾元素
QDataType QueueBack ( Queue * q );
// 獲取隊列中有效元素個數
int QueueSize ( Queue * q );
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回 0
int QueueEmpty ( Queue * q );
// 銷毀隊列
void QueueDestroy ( Queue * q );

//初始化

//初始化
void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}

//入列

//入列
void QueuePush(Que* pq, Qdatatype x)
{assert(pq);//開辟隊列結構動態內存Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//第一次或N+1次if (pq->tail == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}

//出列

//出列
void QueuePop(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->head->next == NULL){//就剩下一個free(pq->head);pq->head = pq->tail = NULL;}else{//剩下兩個及以上Que * del = pq->head;pq->head = pq->head->next;free(del);}pq->size--;
}

// 獲取隊列頭部元素?

// 獲取隊列頭部元素 
Qdatatype QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}

// 獲取隊列隊尾元素?

// 獲取隊列隊尾元素 
Qdatatype QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

// 獲取隊列中有效元素個數?

// 獲取隊列中有效元素個數 
int QueueSize(Que* pq)
{assert(pq);return pq->size;
}

// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0?

// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0 
int QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;
}

//銷毀

//銷毀
void QueueDestroy(Que* pq)
{assert(pq);while (pq->head){Que* del = pq->head->next;free(pq->head);pq->head = del;pq->size--;}pq->head = pq->tail = NULL;
}

擴展知識:

????????隊列適合使用鏈表實現,使用順序結構(即固定的連續空間)實現時會出現假溢出的問題,因此大佬們設計出了循環隊列,循環隊列就是為了解決順序結構實現隊列假溢出問題的

????????循環隊列:實際中我們有時還會使用一種隊列叫循環隊列。如操作系統課程講解生產者消費者模型時可以就會使用循環隊列。環形隊列可以使用數組實現,也可以使用循環鏈表實現。

?

????????同時指向一個位置為空rear(尾)的下一個位置為front(頭)時說明已經填滿此處是多開辟了一個空間來做判斷是否為滿?!!!

?以上就是個人學習線性表的個人見解和學習的解析,歡迎各位大佬在評論區探討!

感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

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

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

相關文章

PHP substr()函數詳解,PHP截取字符串。

「作者主頁」:士別三日wyx 「作者簡介」:CSDN top100、阿里云博客專家、華為云享專家、網絡安全領域優質創作者 「推薦專欄」:對網絡安全感興趣的小伙伴可以關注專欄《網絡安全入門到精通》 substr 一、截取字符串二、截取中文字符串三、leng…

clickhouse集群部署

一、集群部署簡介 部署的詳情可以看官網 先部署兩個server,三個keeper[zookeeper] clickhouse之前依賴的存儲是zookeeper,后來改為了keeper,官網給出了原因 所以這就決定了clickhouse有兩種安裝方式,依賴于keeper做存儲或者依賴于zookeeper做存儲 二、zookeeper作…

注冊中心 —— SpringCloud Netflix Eureka

Eureka 簡介 Eureka 是一個基于 REST 的服務發現組件,SpringCloud 將它集成在其子項目 spring-cloud-netflix 中,以實現 SpringCloud 的服務注冊與發現,同時提供了負載均衡、故障轉移等能力,目前 Eureka2.0 已經不再維護&#xf…

基于YOLOv8模型和Caltech數據集的行人檢測系統(PyTorch+Pyside6+YOLOv8模型)

摘要 基于YOLOv8模型和Caltech數據集的行人檢測系統可用于日常生活中檢測與定位行人,利用深度學習算法可實現圖片、視頻、攝像頭等方式的行人目標檢測,另外本系統還支持圖片、視頻等格式的結果可視化與結果導出。本系統采用YOLOv8目標檢測算法訓練數據集…

C#使用FileInfo和DirectoryInfo類來執行文件和文件夾操作

System.IO.FileInfo 和 System.IO.DirectoryInfo 是C#中用于操作文件和文件夾的類,它們提供了許多有用的方法和屬性來管理文件和文件夾。 System.IO.FileInfo: FileInfo 類用于操作單個文件的信息和內容。以下是一些常用的方法和屬性: Exi…

頻繁full gc 調參

Error message from spark is:java.lang.Exception: application_1678793738534_17900289 Driver Disassociated [akka.tcp://sparkDriverClient11.71.243.117:37931] <- [akka.tcp://sparkYarnSQLAM9.10.130.149:38513] disassociated! 日志里頻繁full gc &#xff0c;可以…

Python Opencv實踐 - 圖像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#圖像上采樣 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #參考資料&#xff1a;https://blo…

js實現將文本轉PDF格式并下載到本地

html里面需要引入jspdf.umd.min.js和FileSaver.js jspdf.umd.min.js&#xff1a;https://www.npmjs.com/package/jspdf FileSaver.js&#xff1a;https://download.csdn.net/download/weixin_45791806/87272893?spm1001.2014.3001.5503 同時項目的根部目錄也需要引入SimHei.tt…

單片機之從C語言基礎到專家編程 - 4 C語言基礎 - 4.7 進制及其轉換

進制是數字的進位計數制&#xff0c;R進制也就是逢R進一。計算機只能識別二進制&#xff0c;也就是逢二進一&#xff0c;例如&#xff0c;11在十進制中為2&#xff0c;在二進制中逢2進1&#xff0c;則為10。以下為進制表示表。 二進制三進制八進制九進制十進制十六進制0000001…

【LeetCode 算法】Find the Losers of the Circular Game 找出轉圈游戲輸家

文章目錄 Find the Losers of the Circular Game 找出轉圈游戲輸家問題描述&#xff1a;分析代碼模擬 Tag Find the Losers of the Circular Game 找出轉圈游戲輸家 問題描述&#xff1a; n 個朋友在玩游戲。這些朋友坐成一個圈&#xff0c;按 順時針方向 從 1 到 n 編號。從…

AD域控制器將輔域控制器角色提升為主域控制器

背景 域控服務器遷移&#xff0c;已將新機器添加為該域的輔域控制器。 主域控制器&#xff1a;test-dc-01 輔域控制器&#xff1a;test-dc-02 需求將主輔域的角色進行互換&#xff0c;test-dc-01更換為輔域&#xff0c;test-dc-02更換為主域。 操作步驟 方法1 命令行修改AD域…

Datawhale Django入門組隊學習Task02

Task02 首先啟動虛擬環境&#xff08;復習一下之前的&#xff09; 先退出conda的&#xff0c; conda deactivate然后cd到我的venv下面 &#xff0c;然后cd 到 scripts&#xff0c;再 activate &#xff08;powershell里面&#xff09; 創建admin管理員 首先cd到項目路徑下&a…

mySQL 視圖 VIEW

簡化版的創建視圖 create view 視圖名 as select col ...coln from 表create view 視圖名&#xff08;依次別名&#xff09; as select col ...coln from 表create view 視圖名 as select col “別名1”&#xff0c;。。。col "別名n" from 表show tab…

Flink的常用算子以及實例

1.map 特性&#xff1a;接收一個數據&#xff0c;經過處理之后&#xff0c;就返回一個數據 1.1. 源碼分析 我們來看看map的源碼 map需要接收一個MapFunction<T,R>的對象&#xff0c;其中泛型T表示傳入的數據類型&#xff0c;R表示經過處理之后輸出的數據類型我們繼續往…

計算機提示vcruntime140_1.dll丟失的解決方法

在使用Windows操作系統時&#xff0c;有時候我們可能會遇到一些應用程序無法正常運行的問題&#xff0c;出現錯誤提示&#xff0c;其中之一可能就是缺少或損壞了vcruntime140_1.dll文件。在遇到這種情況時&#xff0c;我們可以嘗試修復vcruntime140_1.dll文件來解決問題。 先科…

后端 springboot 給 vue 提供參數

前端 /** 發起新增或修改的請求 */requestAddOrEdit(formData) {debuggerif(formData.id undefined) {formData.id }getAction(/material/getNameModelStandard, {standard: this.model.standard,name: this.model.name,model: this.model.model}).then((res) > {if (res …

《零基礎7天入門Arduino物聯網-06》程序基礎-編程語言是什么

配套視頻課程&#xff1a;《零基礎學Arduino物聯網&#xff0c;入門到進階》 配套課件資料獲取&#xff1a;微聯實驗室 配套學習套件購買&#xff1a;淘寶搜索店鋪【微聯實驗室】 程序基礎-編程語言是什么 程序是什么 程序設計可以理解為是用計算機語言創造出一系列指令的過程…

Shell 基本運算符

Shell 基本運算符 Shell 和其他編程語言一樣&#xff0c;支持多種運算符&#xff0c;包括&#xff1a; 算數運算符關系運算符布爾運算符字符串運算符文件測試運算符 原生bash不支持簡單的數學運算&#xff0c;但是可以通過其他命令來實現&#xff0c;例如 awk 和 expr&#…

HuggingFace開源的自然語言處理AI工具平臺

HuggingFace是一個開源的自然語言處理AI工具平臺&#xff0c;它為NLP的開發者和研究者提供了一個簡單、快速、高效、可靠的解決方案&#xff0c;讓NLP變得更加簡單、快速、高效、可靠。 Hugging Face平臺主要包括以下幾個部分&#xff1a; Transformers&#xff1a;一個提供了…