數據結構—隊列和棧

1.二級指針的使用

二級指針:
1. 在被調函數中,想要修改主調函數中的指針變量,需要傳遞該指針變量的地址,形參用二級指針接收。
2.指針數組的數組名是一個二級指針,指針數組的數組名作為參數傳遞時,可用二級指針接收。

指針數組:保存多個指針的數組。

數組名:數組首元素地址。

2.內核鏈表

內核鏈表:雙向循環鏈表
不再將數據存儲在鏈表節點中,而是將結點嵌入到存儲的數據中。

包含的宏:

offset_of : 獲取內核鏈表中鏈表結點到結構體起始位置的偏移量。
container_of:通過偏移量,獲取結構體的首地址(結點首地址-偏移量)。

3.棧

(1)基本概念

①系統棧

特點:先進后出: FILO

②數據結構的棧

棧:只允許從一端進行數據的插入和刪除的線性存儲結構,稱之為棧結構

特點:先進后出: FILO

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

a.順序棧

?滿增棧、滿減棧、空增棧、空減棧

滿棧、空棧:棧頂所在位置是否存在數據

增棧、減棧:按照棧的生長方向區分

b.鏈式棧

(2)基本操作

①創建一個棧

Stack_t *create_stack()
{Stack_t *pstack = malloc(sizeof(Stack_t));if(NULL == pstack){return NULL;}pstack->clen = 0;pstack->ptop = NULL;return pstack;
}

②判斷一個棧是否為空

int is_empty_stack(Stack_t *pstack)
{return NULL == pstack->ptop;
}

③遍歷

int stack_for_each(Stack_t *pstack)
{STNode_t *ptmp = pstack->ptop;if(NULL == pstack){return -1;}else{while(ptmp != NULL){printf("%d  ", ptmp->data);ptmp = ptmp->pnext;}puts("");}
}

④插入

int push_stack(Stack_t *pstack, Data_t data)
{STNode_t *ptmp = malloc(sizeof(STNode_t));if(NULL == ptmp){return -1;}ptmp->data = data;ptmp->pnext = NULL;ptmp->pnext = pstack->ptop;pstack->ptop = ptmp;pstack->clen++;return 1;
}

⑤刪除

int pop_stack(Stack_t *pstack,Data_t *pdata)
{if(NULL == pstack){return -1;}STNode_t *ptmp = pstack->ptop;pstack->ptop = ptmp->pnext;if(pdata != NULL){*pdata = ptmp->data;}free(ptmp);pstack->clen--;return 0;}

⑥獲取棧頂元素

int get_pop_stack(Stack_t *pstack, Data_t *pdata)
{if(NULL == pstack){return -1;}if(NULL == pdata){return -1;}*pdata = pstack->ptop->data;return 0;}

⑦銷毀棧

void destroy_stack(Stack_t *pstack)
{if(is_empty_stack(pstack)){free(pstack);return ;}else{STNode_t *ptmp = pstack->ptop;STNode_t *p = NULL;while(ptmp->pnext != NULL){p =ptmp->pnext;free(ptmp);ptmp = p;}    free(ptmp);}free(pstack);
}
void stack_destory(Stack_t **pstack)
{while(!is_empty_stack(*pstack)){pop_stack(*pstack, NULL);}free(*pstack);*pstack = NULL;
}

4.隊列

(1)基本概念

隊列:允許從一端進行數據的插入,另一端進行數據刪除的線性存儲結構,稱為隊列結構
插入操作,叫入隊操作,插入的這端稱為隊列的隊尾;
刪除操作,叫出隊操作,刪除的這端稱為隊列的隊頭。

特點:先進先出(FIFO)

應用:數據緩存

①鏈式隊列

②順序隊列

循環隊列

[head, tail)

循環隊列為了區分隊空和隊滿,將來少存儲一個數據。
循環隊列如何判空?--》隊頭和隊尾處于同一位置,此時認為隊列為空
循環隊列如何判滿?--》當隊尾+1跟上隊頭時,任務認為隊列為滿

(2)基本操作

①鏈式隊列

a.創建隊列
LQueue_t *create_linkque()
{LQueue_t *plq = malloc(sizeof(LQueue_t));if(NULL == plq){return NULL;} plq->clen = 0;plq->phead = NULL;plq->ptail = NULL;return plq;
}
b.判空
int is_empty_linkque(LQueue_t *plq)
{return NULL == plq->phead;
}
c.遍歷
void linkque_for_each(LQueue_t *plq)
{LQNode_t *ptmp = plq->phead;while(ptmp != NULL){printf("%d  ", ptmp->data);ptmp = ptmp->pnext;}puts("");
}
d.插入
int insert_linkque_tail(LQueue_t *plq, Data_type_t data)
{LQNode_t * ptmp = malloc(sizeof(LQNode_t));if(NULL == ptmp){return -1;}ptmp->data = data;ptmp->pnext = NULL;if(is_empty_linkque(plq)){plq->phead = ptmp;plq->ptail = ptmp;}else{plq->ptail->pnext = ptmp;plq->ptail = ptmp;} plq->clen++;return 1;
}
e.刪除
int delete_linkque_head(LQueue_t *plq, Data_type_t *pdata)
{if(is_empty_linkque(plq)){return -1;}LQNode_t *ptmp = plq->phead;plq->phead = ptmp->pnext;if(pdata != NULL){*pdata = ptmp->data;}free(ptmp);if (NULL == plq->phead){plq->ptail = NULL;}plq->clen--;return 1;}
f.獲取隊頭元素
int get_linkque_head(LQueue_t *plq)
{if(is_empty_linkque(plq)){return -1;}return plq->phead->data;
}
g.銷毀隊列
void destroy_linkque(LQueue_t **plq)
{while(!is_empty_linkque(*plq)){delete_linkque_head(*plq);}free(*plq);*plq = NULL;
}

②順序隊列---》循環隊列

a.創建
Seqque_t *create_seqque()
{Seqque_t *psq = malloc(sizeof(Seqque_t));if (NULL == psq){printf("malloc error\n");return NULL;}psq->head = 0;psq->tail = 0;psq->pbase = malloc(sizeof(Data_type_t) * SEQQUE_MAX_LEN);if (NULL == psq->pbase){printf("malloc error\n");return NULL;}return psq;
}
b.判滿
int is_full_seqque(Seqque_t *psq)
{if ((psq->tail+1)%SEQQUE_MAX_LEN == psq->head){return 1;}return 0;
c.判空
int is_empty_seqque(Seqque_t *psq)
{if (psq->head == psq->tail){return 1;}return 0;
}
d.入隊
int push_seqque(Seqque_t *psq, Data_type_t data)
{if (is_full_seqque(psq)){printf("seqque is full\n");return -1;}psq->pbase[psq->tail] = data;psq->tail = (psq->tail+1) % SEQQUE_MAX_LEN;return 0;
}
e.遍歷
void seqque_for_each(Seqque_t *psq)
{for (int i = psq->head; i < psq->tail; i = (i+1)%SEQQUE_MAX_LEN){printf("%d ", psq->pbase[i]);}printf("\n");
}
f.出隊
int pop_seqque(Seqque_t *psq, Data_type_t *pdata)
{if(is_empty_seqque(psq) || NULL == pdata){return -1;}if(pdata != NULL){*pdata = psq->pbase[psq->head];psq->head = (psq->head + 1) % SEQQUE_MAX_LEN;}return 0;
}
g.獲取隊頭元素
int top_seqque(Seqque_t *psq)
{if(is_empty_seqque(psq)){return -1;}return psq->pbase[psq->head];}
h.銷毀隊列
void destroy_seqque(Seqque_t *psq)
{free(psq->pbase);free(psq);
}

5.棧和隊列的不同

1.?存取規則不同

  • 隊列先進先出(FIFO, First In First Out)
    先進入隊列的元素先被取出(類似排隊)。

  • 后進先出(LIFO, Last In First Out)
    最后入棧的元素最先被取出(類似疊盤子)。

2.?操作接口不同

  • 隊列

    • enqueue(入隊):在隊尾添加元素。

    • dequeue(出隊):從隊頭移除元素。

    • push(入棧):在棧頂添加元素。

    • pop(出棧):從棧頂移除元素。

注:上述函數代碼均沒有主函數

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

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

相關文章

均線:從市場脈搏到量子計算的時空密碼

一部跨越百年的技術分析進化史,揭示金融市場的數學本質 引言:金融市場的永恒羅盤 在華爾街百年風云中,一個簡單的數學工具始終閃耀著智慧光芒——移動平均線(Moving Average)。從杰西利弗莫爾的手繪圖表到文藝復興科技的量子模型,均線系統完成了從經驗工具到科學框架的驚…

Python 通過Playwright+OpenCV破解滑動驗證碼 實例

由于公司最近需要對接某業務系統&#xff0c;涉及到部分數據需要提交至其它平臺業務系統&#xff0c;只有其它平臺賬戶&#xff0c;沒有接口&#xff0c;因此做此開發。首先通過OpenCV計算出驗證驗證碼滑塊距離&#xff0c;根據距離&#xff0c;使用 Playwright 利用滑動距離模…

山東省天地圖API申請并加載到QGIS和ArcGIS Pro中

目的&#xff1a;在QGIS/ArcGIS Pro中加載山東省不同時期的歷史影像1、申請API 山東省天地圖的API和國家天地圖的API不通用&#xff0c;需要單獨申請。 https://shandong.tianditu.gov.cn/ 打開本地服務資源找到影像的詳情頁 點擊申請地址按照下面的步驟一步一步來&#xff0c;…

qt窗口--02

文章目錄qt窗口--02QMessageBoxQColorDialogQFileDialogQFontDialogQInputDialog、結語很高興和大家見面&#xff0c;給生活加點impetus&#xff01;&#xff01;開啟今天的編程之路&#xff01;&#xff01; 作者&#xff1a;?( ‘ω’ )?260 我的專欄&#xff1a;qt&#…

Linux seLinux

Linux seLinux 1、什么是selinux&#xff0c;security enhanced linux–安全加強的linux。 是由美國國家安全局開發的以及歷史。selinux之前是基于自主存取控制方法DAC&#xff0c; 只要符合權限即可&#xff0c;通過suid和sgid特殊權限存在有一定的安全隱患&#xff0c; 甚至一…

Linux: NFS 服務部署與autofs自動掛載的配置

Linux&#xff1a; NFS 服務部署與autofs自動掛載的配置NFS&#xff08;Network File System&#xff0c;網絡文件系統&#xff09;是一種基于 TCP/IP 協議的網絡文件共享協議&#xff0c;允許不同主機在網絡中共享文件資源&#xff0c;實現跨主機的文件訪問與管理&#xff0c;…

【深度學習②】| DNN篇

0 序言 本文將系統介紹基于PyTorch的深度神經網絡&#xff08;DNN&#xff09;相關知識&#xff0c;包括張量的基礎操作、DNN的工作原理、實現流程&#xff0c;以及批量梯度下降、小批量梯度下降方法和手寫數字識別案例。通過學習&#xff0c;你將掌握DNN的核心概念、PyTorch實…

Xcode 26 如何在創建的 App 包中添加特定的目錄

功能需求 在某些情況下,我們需要將特定文件放在 Xcode 編譯鏈接后 App 包里的指定目錄中,比如將 AI 大模型相關文件放在它們對應名稱的目錄中: 正常情況下,Xcode 會將項目目錄中的所有文件都平鋪放到 App 包的根目錄里。那么,要如何形成上面這種文件目錄層級呢? 在本篇…

linux-系統性能監控

linux-系統性能監控一、cpu1.1 查看cpu的信息1.2 cpu性能指標1.3 編寫監控cpu使用率的腳本1.4 查找出使用cpu最高的10個進程二、內存2.1 查看內存信息2.2 交換&#xff08;swap&#xff09;分區2.2.1 查看交換分區的積極程度2.2.2 查看交換分區的大小2.2.3 管理交換分區2.3 編寫…

AgxOrin平臺JetPack5.x版本fix multi-cam race condition 補丁

本文包含三個針對NVIDIA Linux驅動程序的補丁修復: 多攝像頭競爭條件修復 在capture-ivc驅動中新增信號量機制,解決多攝像頭同時操作時的競爭條件問題(Bug 4425972)。主要修改包括在通道上下文結構中添加信號量,并在通道ID通知和取消注冊時進行信號量操作。 內存泄漏修復…

【Go】P3 Go語言程序結構

Go語言程序結構Go語言程序結構命名規則與編程慣例核心規則四種聲明語句詳解var聲明&#xff1a;變量聲明const聲明&#xff1a;常量聲明type聲明&#xff1a;類型定義func聲明&#xff1a;函數聲明簡短變量聲明(:)使用規則和限制指針&#xff1a;安全的內存地址操作基本概念和操…

【機器學習深度學習】知識蒸餾實戰:讓小模型擁有大模型的智慧

目錄 引言&#xff1a;模型壓縮的迫切需求 一、知識蒸餾的核心原理 1.1 教師-學生模式 1.2 軟目標&#xff1a;知識傳遞的關鍵 1.3 蒸餾損失函數 二、實戰&#xff1a;Qwen模型蒸餾實現 2.1 環境配置與模型加載 2.2 蒸餾損失函數實現 2.3 蒸餾訓練流程 2.4 訓練優化技…

基于MCP提示構建工作流程自動化的實踐指南

引言 在現代工作和生活中&#xff0c;我們經常被各種重復性任務所困擾——從每周的膳食計劃到代碼審查反饋&#xff0c;從文檔更新到報告生成。這些任務雖然不復雜&#xff0c;卻消耗了大量寶貴時間。MCP&#xff08;Model Context Protocol&#xff09;提示技術為解決這一問題…

apache-tomcat-11.0.9安裝及環境變量配置

一、安裝從官網上下載apache-tomcat-11.0.9,可以下載exe可執行文件版本&#xff0c;也可以下載zip版本&#xff0c;本文中下載的是zip版本。將下載的文件解壓到指定目錄&#xff1b;打開tomcat安裝目錄下“\conf\tomcat-users.xml”文件&#xff1b;輸入以下代碼&#xff0c;pa…

Java 大視界 -- Java 大數據機器學習模型在電商用戶生命周期價值評估與客戶關系精細化管理中的應用(383)

Java 大視界 -- Java 大數據機器學習模型在電商用戶生命周期價值評估與客戶關系精細化管理中的應用&#xff08;383&#xff09;引言&#xff1a;正文&#xff1a;一、電商用戶運營的 “糊涂賬”&#xff1a;不是所有客戶都該被討好1.1 運營者的 “三大錯覺”1.1.1 錯把 “過客…

豆包新模型與PromptPilot工具深度測評:AI應用開發的全流程突破

目錄引言一、豆包新模型技術解析1.1 豆包新模型介紹1.2 核心能力突破1.2.1 情感交互能力1.2.2 推理與編碼能力二、PromptPilot工具深度測評2.1 PromptPilot介紹2.2 工具架構與核心功能2.3 一個案例講通&#xff1a;市場調研報告2.3.1 生成Prompt2.3.2 批量集生成2.3.3 模擬數據…

【代碼隨想錄day 12】 力扣 144.145.94.前序遍歷中序遍歷后序遍歷

視頻講解&#xff1a;https://www.bilibili.com/video/BV1Wh411S7xt/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86.html#%E5%85%B6%E4%BB%96%E8%A…

【Unity】 HTFramework框架(六十七)UDateTime可序列化日期時間(附日期拾取器)

更新日期&#xff1a;2025年8月6日。 Github 倉庫&#xff1a;https://github.com/SaiTingHu/HTFramework Gitee 倉庫&#xff1a;https://gitee.com/SaiTingHu/HTFramework 索引一、UDateTime可序列化日期時間1.定義UDateTime字段2.日期拾取器&#xff08;編輯器&#xff09;3…

Docker的安裝,服務器與客戶端之間的通信

目錄 1、Docker安裝 1.1主機配置 1.2apt源的修改 1.3apt安裝 2、客戶端與服務端通信 2.1服務端配置 2.1.1創建鏡像存放目錄 2.1.2修改配置文件 2.2端口通信 2.3SSH連接 2.3.1生成密鑰 2.3.2傳輸密鑰 2.3.3測試連接 1、Docker安裝 1.1主機配置 我使用的兩臺主機是…

【算法專題訓練】09、累加子數組之和

1、題目&#xff1a;LCR 010. 和為 K 的子數組 https://leetcode.cn/problems/QTMn0o/description/ 給定一個整數數組和一個整數 k &#xff0c;請找到該數組中和為 k 的連續子數組的個數。示例 1&#xff1a; 輸入:nums [1,1,1], k 2 輸出: 2 解釋: 此題 [1,1] 與 [1,1] 為兩…