數據結構(七)---鏈式棧

#### 鏈式棧實現

##### linkstack.h

#ifndef _LINKSTACK_H
#define _LINKSTACK_H


// 引入相關的庫文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// 定義元素類型的別名
typedef int DATA;


//定義鏈式棧節點
typedef struct node
{
?? ?DATA data;
?? ?struct node *next;
}NODE;


//定義鏈式棧結構體
typedef struct?
{
?? ?NODE *top; ? ? //棧頂指針,其實就是鏈表中的頭節點
?? ?int size; ? ? //當前元素數量
?? ?int capacity; ? ? //棧容量
}LinkStack;


/**
?* 初始化鏈式棧
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @param num 棧容量的大小
?* @return 初始化成功返回0,否則返回-1
?*/
extern int lstack_init(LinkStack *s, int num);


/**
?* 判斷棧是否已滿
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @return 棧已滿返回1
?*/
extern int lstack_isfull(LinkStack *s);


/**
?* 入棧
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @param data 待入棧的數據
?* @return 成功返回0,否則返回-1
?*/
extern int lstack_push(LinkStack *s, DATA data);


/**
?* 判斷棧是否為空
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @return 棧為空返回1
?*/
extern int lstack_isempty(LinkStack *s);


/**
?* 出棧
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @param data 接收出棧的數據指針
?* @return 成功返回0,否則返回-1
?*/
extern int lstack_pop(LinkStack *s, DATA *data);


/**
?* 銷毀棧
?*/
extern void lstack_destroy(LinkStack *s);


#endif //_LINKSTACK_H
```

##### linkstack.c

#include "linkstack.h"


/**
?* 初始化鏈式棧
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @param num 棧容量的大小
?* @return 初始化成功返回0,否則返回-1
?*/
int lstack_init(LinkStack *s, int num)
{
?? ?//空指針檢查
?? ?if(!s)
?? ?{
?? ??? ?perror("創建失敗!");
?? ??? ?return -1;
?? ?}
?? ?
?? ?//num的檢查
?? ?if(num <= 0)
?? ?{
?? ??? ?perror("容量有誤,創建失敗!");
?? ??? ?return -1;
?? ?}
?? ?
?? ?//初始化棧屬性
?? ?s->top = NULL; ? ? //棧頂指針置空,表示空棧
?? ?s->size = 0; ? ? //當前元素數量為0?
?? ?s->capacity = num; ? ? //設置容量限制(需后續操作中校驗)
?? ?
?? ?return 0;
}


/**
?* 判斷棧是否已滿
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @return 棧已滿返回1
?*/
int lstack_isfull(LinkStack *s)
{
?? ?return s->size >= s->capacity;
}


/**
?* 入棧
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @param data 待入棧的數據
?* @return 成功返回0,否則返回-1
?*/
int lstack_push(LinkStack *s, DATA data)
{
?? ?//判斷棧是否已滿
?? ?if(lstack_isfull(s))
?? ?{
?? ??? ?perror("棧已滿,數據無法入棧!");
?? ??? ?return -1;
?? ?}
?? ?
?? ?//創建新節點
?? ?NODE *p = (NODE*)malloc(sizeof(NODE));
?? ?if(!p)
?? ?{
?? ??? ?perror("Memory allocation failed!");
?? ??? ?return -1;
?? ?}
?? ?
?? ?//初始化
?? ?p->data = data; ? ? //存儲數據
?? ?p->next = s->top; ? ? //新節點指向原棧頂
?? ?s->top = p; ? ? //更新棧頂指針為新節點
?? ?s->size++; ? ? //元素計數增加
?? ?
?? ?return 0;
}


/**
?* 判斷棧是否為空
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @return 棧為空返回1
?*/
int lstack_isempty(LinkStack *s)
{
?? ?if(!s)
?? ??? ?return 1; ? ? //空指針視為空棧
?? ?
?? ?return s->size == 0;
?? ?//return s->top = NULL;
}


/**
?* 出棧
?* @param s 棧結構體指針(需由調用者提前分配內存)
?* @param data 接收出棧的數據指針
?* @return 成功返回0,否則返回-1
?*/
int lstack_pop(LinkStack *s, DATA *data)
{
?? ?if(!s || !data)
?? ?{
?? ??? ?perror("Stack is empty!");
?? ??? ?return -1;
?? ?}
?? ?
?? ?//判斷棧是否為空
?? ?if(lstack_isempty(s))
?? ?{
?? ??? ?perror("警告!試圖從空棧彈出數據!");
?? ??? ?return -1;
?? ?}
?? ?
?? ?NODE *p = s->top; ? ? //保存棧頂節點
?? ?*data = p->data; ? ? //獲取彈出棧的數據
?? ?s->top = p->next; ? ? //更新棧頂指針
?? ?free(p); ? ? //釋放原棧頂節點
?? ?s->size--;
?? ?
?? ?return 0;
}


/**
?* 銷毀棧
?*/
void lstack_destroy(LinkStack *s)
{
?? ?if(!s)?
?? ??? ?return; ? ? //空指針保護
?? ?
?? ?DATA temp; ? ? //臨時存儲彈出數據
?? ?
?? ?//釋放所有節點
?? ?while(!lstack_isempty(s))
?? ?{
?? ??? ?lstack_pop(s, &temp); ? ? //彈出數據存入temp
?? ?}
?? ?return;
}
```

##### app.c

#include "linkstack.h"

int main(int argc, char const *argv[])
{
? ? LinkStack s;
? ? DATA temp;

? ? // 1. 初始化容量為10的鏈式棧
? ? lstack_init(&s, 10);

? ? // 2. 入棧測試
? ? printf("入棧順序:");
? ? for (int i = 0; i < 10; i++)
? ? {
? ? ? ? lstack_push(&s, i + 10); // 壓入10~19
? ? ? ? printf("%d ", i + 10);
? ? }
? ? printf("\n");

? ? // 測試棧滿
? ? if (lstack_push(&s, 20) == -1)
? ? ? ? printf("棧已滿,插入20失敗\n");

? ? // 3. 出棧測試
? ? printf("出棧順序:");
? ? while (!lstack_isempty(&s))
? ? {
? ? ? ? lstack_pop(&s, &temp);
? ? ? ? printf("%d ", temp);
? ? }
? ? printf("\n");

? ? // 測試棧空
? ? if (lstack_pop(&s, &temp) == -1)
? ? ? ? printf("棧已空,無法彈出\n");

? ? // 4. 銷毀棧
? ? lstack_destroy(&s);
? ? return 0;
}

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

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

相關文章

【Spring Boot】Maven中引入 springboot 相關依賴的方式

文章目錄 Maven中引入 springboot 相關依賴的方式1. 不使用版本管理&#xff08;不推薦&#xff09;2、使用版本管理&#xff08;推薦&#xff09;2.1 繼承 spring-boot-starter-parent2.2 使用 spring-boot-dependencies 自定義父工程2.3引入 spring-framework-bom Maven中引…

DataStreamAPI實踐原理——快速上手

引入 通過編程模型&#xff0c;我們知道Flink的編程模型提供了多層級的抽象&#xff0c;越上層的API&#xff0c;其描述性和可閱讀性越強&#xff0c;越下層API&#xff0c;其靈活度高、表達力越強&#xff0c;多數時候上層API能做到的事情&#xff0c;下層API也能做到&#x…

WPF 圖片文本按鈕 自定義按鈕

效果 上面圖片,下面文本 樣式 <!-- 圖片文本按鈕樣式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

驅動開發硬核特訓 · Day 22(上篇): 電源管理體系完整梳理:I2C、Regulator、PMIC與Power-Domain框架

&#x1f4d8; 一、電源子系統總覽 在現代Linux內核中&#xff0c;電源管理不僅是系統穩定性的保障&#xff0c;也是實現高效能與低功耗運行的核心機制。 系統中涉及電源管理的關鍵子系統包括&#xff1a; I2C子系統&#xff1a;硬件通信基礎Regulator子系統&#xff1a;電源…

設計模式全解析:23種經典設計模式及其應用

創建型模式 1. 單例模式&#xff08;Singleton Pattern&#xff09; 核心思想&#xff1a;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。適用場景&#xff1a;需要共享資源的場景&#xff0c;如配置管理、日志記錄等。 public class Singleton {// 靜態變量保存…

力扣熱題100題解(c++)—矩陣

73.矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 int m matrix.size(); // 行數int n matrix[0].size(); // 列數bool firstRowZero false; // 標記第一行是否包含 0bool f…

本地部署DeepSeek-R1(Dify升級最新版本、新增插件功能、過濾推理思考過程)

下載最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升級DIfy 下載最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我這里下載到老版本同一個目錄并解壓 拷貝老數據 需先停用老版本Dify PS D:\D…

PostSwigger Web 安全學習:CSRF漏洞3

CSRF 漏洞學習網站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服務端生成的唯一、隨機且不可預測的字符串&#xff0c;用于驗證客戶端合法校驗。 作用&#xff1a;防止攻擊…

用 Nodemon 解決 npm run serve 頻繁重啟服務

Nodemon 是一個基于 Node.js 構建的開發工具&#xff0c;專為幫助開發者自動監控項目文件的更改而設計。每當文件發生變更時&#xff0c;Nodemon 會自動重啟 Node.js 服務器&#xff0c;無需手動停止并重啟。這對于提升開發速度、減少人工操作非常有幫助&#xff0c;尤其適用于…

django admin 中更新表數據 之后再將數據返回管理界面

在Django中&#xff0c;更新數據庫中的數據并將其重新顯示在Django Admin界面上通常涉及到幾個步驟。這里我將詳細說明如何在Django Admin中更新表數據&#xff0c;并確保更新后的數據能夠立即在管理界面上顯示。 定義模型 首先&#xff0c;確保你的模型&#xff08;Model&…

真.從“零”搞 VSCode+STM32CubeMx+C <1>構建

目錄 前言 準備工作 創建STM32CubeMx項目 VSCode導入項目&配置 構建錯誤調試 后記 前言 去年10月開始接觸單片機&#xff0c;一直在用樹莓派的Pico&#xff0c;之前一直用Micropython&#xff0c;玩的不亦樂乎&#xff0c;試錯階段優勢明顯&#xff0c;很快就能鼓搗一…

C語言學習之結構體

在C語言中&#xff0c;我們已經學了好幾種類型的數據。比如整型int、char、short等&#xff0c;浮點型double、float等。但是這些都是基本數據類型&#xff0c;而這些數據類型應用在實際編程里顯然是不夠用的。比如我們沒有辦法用一旦數據類型來定義一個”人“的屬性。因此這里…

架構-計算機系統基礎

計算機系統基礎 一、計算機系統組成 &#xff08;一&#xff09;計算機系統層次結構 硬件組成 主機&#xff1a;包含CPU&#xff08;運算器控制器&#xff09;、主存儲器&#xff08;內存&#xff09;。外設&#xff1a;輸入設備、輸出設備、輔助存儲器&#xff08;外存&…

【計算機網絡性能優化】從基礎理論到實戰調優

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現案例1&#xff1a;iPerf3帶寬測試案例2&#xff1a;TCP窗口優化案例3&#xff1a;QoS流量整形 運行…

Python 自動化辦公:Excel 數據處理的“秘密武器”

引言 在日常的 IT 辦公場景里&#xff0c;Excel 是數據處理與分析的 “常勝將軍”。無論是財務人員整理賬目、銷售團隊統計業績&#xff0c;還是運營人員分析用戶數據&#xff0c;Excel 都發揮著關鍵作用。但面對海量數據&#xff0c;手動操作 Excel 不僅效率低下&#xff0c;還…

緩存集群技術深度解析:從原理到實戰

緩存集群技術深度解析&#xff1a;從原理到實戰 一、緩存集群核心定位與架構選型 1. 集群模式核心價值 緩存集群通過數據分片、高可用保障、水平擴展解決單節點瓶頸&#xff0c;核心能力包括&#xff1a; 數據分片&#xff1a;將數據分散到多個節點&#xff0c;突破單節點內…

CSDN編輯文章時如何自動生成目錄

如何自動生成目錄 前置條件1. 插入目錄標識符2. 編寫標題層級 前置條件 需要使用markdown編輯&#xff0c;并且只有按照markdown語法編寫不同的標題級別&#xff0c;才能使用這個方法自動生成對應的目錄。 1. 插入目錄標識符 在文章的頂部添加以下代碼&#xff1a; [TOC](文…

產品經理對于電商接口的梳理||電商接口文檔梳理與接入

接口梳理7個注意點總結 ①注意要測試環境和生產環境。生產上線時候要提醒研發換到生產環境調用。 ②注意必輸字段和選輸字段&#xff0c;要傳入字段的含義和校驗。枚舉值不清楚含義的要詢問對方含義&#xff0c;比如說單據類型字段枚舉值是B2C發貨單&#xff0c;BBC發貨單&am…

更快的圖像局部修改與可控生成:Flex.2-preview

Flex.2-preview 文本生成圖像擴散模型介紹 一、模型簡介 Flex.2-preview 是一種 開源的 80 億參數文本生成圖像擴散模型&#xff0c;具備通用控制和修復支持功能&#xff0c;是 Flex.1alpha 的下一代版本。該模型由社區開發并為社區服務&#xff0c;采用 Apache 2.0 許可證&a…

【Castle-X機器人】一、模塊安裝與調試:機器人底盤

持續更新。。。。。。。。。。。。。。。 【ROS機器人】模塊安裝 一、Castle-X機器人底盤1.1 結構概述1.2 驅動執行結構1.3 環境傳感器1.4 電氣系統1.5 Castle-x機器人底盤測試激光雷達傳感器測試及數據可視化超聲波傳感器實時數據獲取防跌落傳感器測試陀螺儀測試鍵盤控制測試…