C語言 數據結構 【棧】動態模擬實現

引言

? ? ? ? 動態模擬實現棧的各個接口

一、棧的概念與結構

????????棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底棧中的數據元素遵守后進先出LIFO(LastInFirstOut)的原則。

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

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

棧底層結構選型

????????棧的實現?般可以使用數組或者鏈表實現,相對而言數組的結構實現更優一些。因為數組在尾上插入數據的代價比較小。而且與鏈表的結構體相比,數組所占內存的較小。?

?二、棧的模擬實現

因為棧是用動態數組來模擬實現的,所以順序表要是會的話,這個是很簡單的

分三個文件來寫:以代碼注釋為主

test.c //測試文件,測試棧的接口是否正確
Stack.h //實現棧所需要的所有的頭文件(核心)
Stack.c //實現棧各個接口的代碼(核心)

1、在Stack.h中定義棧的結構:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int STDataType;  //取別名,方便以后修改數據類型typedef struct Stack
{STDataType* arr;   //數組int top;           //棧的有效元素個數int capacity;      //棧的總大小
}ST;                   //取別名,方便下面代碼的書寫

2、棧的初始化、入棧

//初始化
void StackInit(ST* ps)
{ps->arr = NULL;      //先將數組指針設置為NULLps->top = ps->capacity = 0; //都是0
}//入棧 -- 棧頂入棧
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity) //空間不夠先增容{int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity; //以二倍方式擴容STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;  //將擴容后的地址給Stack的arrps->capacity = newCapacity;  //修改空間大小;}ps->arr[ps->top++] = x; //賦值
}

3、判斷棧是否為空、出棧操作

//判斷棧是否為空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出棧 -- 棧頂出棧
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;  //將棧頂減一
}

4、取棧頂元素(不出棧)、獲取棧中有效元素個數

//取棧頂元素(不出棧)
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}
//獲取棧中有效元素個數
int StackSize(ST* ps)
{return ps->top;
}

5、銷毀棧?

//摧毀
void StackDestory(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}

3、所有代碼:

Stack.h中的代碼:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int STDataType;  //取別名,方便以后修改數據類型typedef struct Stack
{STDataType* arr;   //數組int top;           //棧的有效元素個數int capacity;      //棧的總大小
}ST;                   //取別名,方便下面代碼的書寫//初始化
void StackInit(ST* ps);//摧毀
void StackDestroy(ST* ps);//入棧 -- 棧頂入棧
void StackPush(ST* ps, STDataType x);//判斷棧是否為空
bool StackEmpty(ST* ps);//出棧 -- 棧頂出棧
void StackPop(ST* ps);//取棧頂元素(不出棧)
STDataType StackTop(ST* ps);//獲取棧中有效元素個數
int StackSize(ST* ps);

Stack.c文件中的代碼:

#include"Stack.h"//初始化
void StackInit(ST* ps)
{ps->arr = NULL;      //先將數組指針設置為NULLps->top = ps->capacity = 0; //都是0
}//入棧 -- 棧頂入棧
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity) //空間不夠先增容{int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity; //以二倍方式擴容STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;  //將擴容后的地址給Stack的arrps->capacity = newCapacity;  //修改空間大小;}ps->arr[ps->top++] = x; //賦值
}//判斷棧是否為空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出棧 -- 棧頂出棧
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;  //將棧頂減一
}//取棧頂元素(不出棧)
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}
//獲取棧中有效元素個數
int StackSize(ST* ps)
{return ps->top;
}//摧毀
void StackDestory(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}

test.c文件中的代碼:

#include"Stack.h"int main()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);StackPop(&st);StackPop(&st);int size = StackSize(&st);printf("%d ", size);while (!StackEmpty(&st)){StackPop(&st);size = StackSize(&st);printf("%d ", size);}return 0;
}

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

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

相關文章

Python itertools模塊的groupby函數介紹

itertools.groupby 是 Python 標準庫 itertools 模塊中的一個函數&#xff0c;它的主要功能是對可迭代對象中相鄰的相同元素進行分組。 itertools.groupby(iterable, keyNone) 函數 作用&#xff1a; 將連續的&#xff08;相鄰的&#xff09;相同元素分組&#xff0c;返回 (…

Python實例題:使用Python生成分形圖片

目錄 Python實例題 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 mandelbrot 函數&#xff1a; 設置復平面區域和圖像參數&#xff1a; 計算分形數據&#xff1a; 繪圖展示&#xff1a; 運行思路 Python實例題 題目 使用Python生成分形圖…

系統編程1(進程的概念與原理)

進程的概念與原理 計算機組成部分一般遵循馮諾依曼結構&#xff0c;也就是由控制器、運算器、存儲器、輸入設備、輸出設備五個部分組成。 ? 程序的編譯 一般在編寫出程序之后&#xff0c;并不能直接運行&#xff0c;而是需要把程序通過編譯器進行編譯&#xff0c;生成可執行…

《Vue Router實戰教程》5.嵌套路由

歡迎觀看《Vue Router 實戰&#xff08;第4版&#xff09;》視頻課程 嵌套路由 一些應用程序的 UI 由多層嵌套的組件組成。在這種情況下&#xff0c;URL 的片段通常對應于特定的嵌套組件結構&#xff0c;例如&#xff1a; 通過 Vue Router&#xff0c;你可以使用嵌套路由配置…

使用Python解決Logistic方程

引言 在數學和計算機科學中,Logistic 方程是描述人口增長、傳播過程等現象的一種常見模型。它通常用于表示一種有限資源下的增長過程,比如動物種群、疾病傳播等。本文將帶領大家通過 Python 實現 Logistic 方程的求解,幫助你更好地理解這一經典數學模型。 1.什么是 Logist…

《從零搭建Vue3項目實戰》(AI輔助搭建Vue3+ElemntPlus后臺管理項目)零基礎入門系列第十二篇(完結篇):數據統計功能實現

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 《從零搭建Vue3項目實戰》&#xff08;AI輔助…

研究嵌入式軟件架構時遇到的初始化堆棧溢出問題

文章目錄 2025年4月10日新增分析PC寄存器指針值排查問題map文件設計到的知識點1. **.bss 段&#xff08;Block Started by Symbol&#xff09;**2. **.data 段**3. **.text 段**4. **.heap 段**5. **.stack 段**6. **.rodata 段&#xff08;只讀數據段&#xff09;**7. **.init…

軟件架構評估兩大法:ATAM 和 SAAM 的對比與實踐

架構權衡分析方法&#xff08;ATAM&#xff09;和軟件架構分析方法&#xff08;SAAM&#xff09;是軟件架構評估領域中非常重要的兩種方法&#xff0c;以下為你詳細介紹&#xff1a; 一、架構權衡分析方法&#xff08;ATAM&#xff09; 1.背景與起源&#xff1a;ATAM 是由卡耐…

Python爬蟲-爬取全球股市漲跌幅和漲跌額數據

前言 本文是該專欄的第52篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文中,筆者將基于Python爬蟲,實現批量采集全球股市行情(亞洲,美洲,歐非,其他等)的各股市“漲跌幅”以及“漲跌額”數據。 具體實現思路和詳細邏輯,筆者將在正文結合完整代碼進行詳細介紹。…

電流互感器的兩相星形接線的建模與仿真

微?“電擊小子程高興的MATLAB小屋”獲取巨額優惠 1.模型簡介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2016Rb&#xff09;軟件。建議采用matlab2016 Rb及以上版本打開。&#xff08;若需要其他版本可聯系代為轉換&#xff09; 2.仿真模型 3.仿真結果 3.1一次…

詳解 kotlin 相對 Java 特有的關鍵字及使用

文章目錄 1. val 和 var2. fun3. when4. is 和 !is5. lateinit6. by7. reified8. companion 本文首發地址&#xff1a;https://h89.cn/archives/366.html 最新更新地址&#xff1a;https://gitee.com/chenjim/chenjimblog Kotlin 在兼容Java的基礎上&#xff0c;引入了許多特有…

國標GB28181視頻平臺EasyCVR如何搭建汽車修理廠遠程視頻網絡監控方案

一、背景分析 近年我國汽車保有量持續攀升&#xff0c;與之相伴的汽車保養維修需求也逐漸提高。隨著社會經濟的發展&#xff0c;消費者對汽車維修服務質量的要求越來越高&#xff0c;這使得汽車維修店的安全防范與人員管理問題面臨著巨大挑戰。 多數汽車維修店分布分散&#…

linux RCU技術

RCU&#xff08;Read-Copy-Update&#xff09;是Linux內核中的一種同步機制&#xff0c;用于在多核處理器環境中實現無鎖讀取和延遲更新。Linux RCU&#xff08;Read-Copy-Update&#xff09;技術通過一種高效的同步機制來處理并發沖突&#xff0c;確保在多核環境中讀者和寫者對…

【筆記ing】AI大模型-02開發環境搭建

按實驗需求合理選用實例規格&#xff0c;一般&#xff1a;模型開發階段&#xff1a;使用最低算力2U8GB CPU。訓練或推理階段&#xff1a;切換至GPU規格&#xff0c;用完及時關閉算力環境&#xff0c;且切回最低算力規格。 每次實驗結束手動關閉實例。使用ModelArts公有云資源。…

Python——numpy測試題目

題目&#xff1a; 生成一個2行3列隨機整數二維數組a使用Numpy方法對&#xff08;1&#xff09;中數組a進行整體求積使用Numpy方法對&#xff08;1&#xff09;中數組a進行求每列最大值索引定義一個NumPy一維數組 b&#xff0c;元素為 1 到 10 的整數獲取&#xff08;4&#x…

系分論文《論面向服務開發方法在設備租賃行業的應用》

系統分析師論文系列 【摘要】 2022年5月&#xff0c;我司承接某工程機械租賃企業"智能租賃運營管理平臺"建設項目&#xff0c;我作為系統分析師主導系統架構設計。該項目需整合8大類2000余臺設備資產&#xff0c;覆蓋全國15個區域運營中心與300家代理商&#xff0c;實…

Unity UI中的Pixels Per Unit

Pixels Per Unit在圖片導入到Unity的時候&#xff0c;將圖片格式設置為Sprite的情況下會出現&#xff0c;其意思是精靈中的多少像素對應世界中的一個單位&#xff0c;默認是100 1. 對于在世界坐標中 在世界坐標中&#xff0c;一般對于Sprite的應用是Sprite Renderer組件 使…

Boost Graph Library (BGL) 介紹與使用示例

Boost Graph Library (BGL) 介紹與使用示例 Boost Graph Library (BGL) 是 Boost 庫中用于圖論計算的模塊&#xff0c;提供了處理圖數據結構的通用接口和多種圖算法實現。 BGL 主要特性 提供多種圖表示方式&#xff1a;鄰接表、鄰接矩陣等包含常用圖算法&#xff1a;DFS、BF…

opencv(C++)操作圖像像素

文章目錄 添加噪點的案例圖像像素值1、訪問圖像屬性2、像素訪問方法 at灰度圖像彩色圖像 3、OpenCV 的向量類型4、 圖像傳遞方式 The cv::Mat_ 類1、作用及優點2、使用 cv::Mat_ 簡化像素訪問 用指針掃描圖像背景算法案例原理1. 圖像數據存儲的基本結構2、行填充&#xff08;Pa…

Python實現貪吃蛇一

貪吃蛇是一款經典的小游戲&#xff0c;最近嘗試用Python實現它。先做一個基礎版本實現以下目標&#xff1a; 1、做一個按鈕&#xff0c;控制游戲開始 2、按Q鍵退出游戲 3、右上角顯示一個記分牌 4、隨機生成一個食物&#xff0c;蛇吃到食物后長度加一&#xff0c;得10分 5、蛇碰…