棧的概念以及實現

目錄:

一、棧的概念

二、棧的實現

1.棧的初始化

2.棧的銷毀

3.入棧

4.出棧

5.獲取棧頂數據

6.判斷棧是否為空

7.獲取棧的個數

三、代碼

一、棧的概念

棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。
進行數據插入和刪除操作的一端
稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據也在棧頂。
例:比如手槍彈夾,先壓進去的子彈往往是后發射出去,也就是遵循后進先出的原則。
首先來創建一個結構體,我們是基于數組實現的棧,一個棧首先要有數組存放數據,給一個top表示個數,給一個capacity表示空間大小:
typedef int stacktype;
typedef struct Stack
{stacktype* a;//動態數組int top;    //個數int capacity;//空間
}ST;

二、棧的實現

1.棧的初始化

一開始,數組為空,并且top和capacity都為0,這里的top有兩種初始化方法,如果我們想讓他指向棧中的最后一個數據,那么它的值就不能是數組的起始下標0,而應該給一個無關的數,比如-1;第二種就是top表示棧頂數據的下一個位置,那我們就可以給他賦值0,這里我們使用第二種方法:

void STInit(ST* pst)//初始化
{assert(pst);pst->a = NULL;pst->top = 0;//基于size指向的是棧頂數據的下一個位置pst->capacity = 0;
}

2.棧的銷毀

刪除也是很簡單,原理和順序表都差不多:

void STDestroy(ST* pst)//銷毀
{assert(pst);free(pst->a);//free掉pst->a = NULL;//置為空,防止變成野指針pst->top = 0;pst->capacity = 0;
}

3.入棧

首先要明白,棧是棧頂入,棧頂出,所以所有數據都從棧頂進入,也就是top的位置,隨后top++就可以,擴容和順序表一樣,詳情可以參考:https://blog.csdn.net/xpcxpt/article/details/147466492?spm=1001.2014.3001.5501

總體代碼如下:

void STPush(ST* pst, stacktype x)//插入 入棧
{assert(pst);//擴容if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;stacktype* tmp = (stacktype*)realloc(pst->a, newcapacity * sizeof(stacktype));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}

4.出棧

出棧也就是刪除一個棧頂的數據,那只需要讓top--就可以了:

void STPop(ST* pst)//刪除 出棧
{assert(pst);assert(pst->top > 0);//top是非負數pst->top--;//刪除一個
}

5.獲取棧頂數據

top的位置的棧頂數據的下一個位置,所以要想獲取棧頂元素,就要獲取top-1位置的元素:

stacktype STTop(ST* pst)//獲取棧頂數據
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}

6.判斷棧是否為空

直接判斷棧中數據數量top是否為空,這里可以使用bool類型,不為空返回true,為空返回fulse:
?

bool STEmpty(ST* pst)//判斷棧是否為空
{assert(pst);return pst->top == 0;
}

7.獲取棧的個數

這里也是非常簡單,就是獲取top的大小,幾行代碼就搞定了:

int STSize(ST* pst)//判斷棧的數據個數
{assert(pst);return pst->top;//從0開始的,所以返回size的大小-1,也就是下表從0-top-1,一共top個
}

三、代碼

總體代碼如下:

test.c:

#include "stack.h"int main()
{ST s;STInit(&s);STPush(&s, 1);STPush(&s, 2);//printf("%d ", STTop(&s));STPush(&s, 3);STPush(&s, 4);while (!STEmpty(&s)){printf("%d ", STTop(&s));STPop(&s);}STDestroy(&s);
}

stack.h:
?

#pragma once#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int stacktype;
typedef struct Stack
{stacktype* a;//動態數組int top;    //個數int capacity;//空間
}ST;void STInit(ST* pst);//初始化
void STDestroy(ST* pst);//銷毀
void STPush(ST* pst, stacktype x);//插入 入棧
void STPop(ST* pst);//刪除 出棧
stacktype STTop(ST* pst);//獲取棧頂數據
bool STEmpty(ST* pst);//判斷棧是否為空
int STSize(ST* pst);//判斷棧的數據個數

stack.c:
?

#include "stack.h"void STInit(ST* pst)//初始化
{assert(pst);pst->a = NULL;pst->top = 0;//基于size指向的是棧頂數據的下一個位置pst->capacity = 0;
}void STDestroy(ST* pst)//銷毀
{assert(pst);free(pst->a);//free掉pst->a = NULL;//置為空,防止變成野指針pst->top = 0;pst->capacity = 0;
}void STPush(ST* pst, stacktype x)//插入 入棧
{assert(pst);//擴容if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;stacktype* tmp = (stacktype*)realloc(pst->a, newcapacity * sizeof(stacktype));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)//刪除 出棧
{assert(pst);assert(pst->top > 0);//top是非負數pst->top--;//刪除一個
}
stacktype STTop(ST* pst)//獲取棧頂數據
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)//判斷棧是否為空
{assert(pst);return pst->top == 0;
}
int STSize(ST* pst)//判斷棧的數據個數
{assert(pst);return pst->top;//從0開始的,所以返回size的大小-1,也就是下表從0-top-1,一共top個
}

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

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

相關文章

【Bluedroid】藍牙啟動之 SMP_Init 源碼解析

藍牙(安全管理協議,Security Management Protocol)是藍牙設備安全通信的核心協議,負責配對、密鑰協商和安全等級管理。本文圍繞 Bluedroid SMP 協議的初始化流程展開,系統解析其核心控制塊(tSMP_CB)的狀態管理、與 L2CAP 層的接口注冊,以及 P-256 橢圓曲線參數的初始化…

C++課設:考勤記錄系統

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 專欄介紹&#xff1a;《編程項目實戰》 目錄 一、項目背景與需求分析1. 傳統考勤管理…

前端面試題之ES6保姆級教程

ES6 核心特性深度解析&#xff1a;現代 JavaScript 開發基石 2015 年發布的 ECMAScript 2015&#xff08;ES6&#xff09;徹底改變了 JavaScript 的編程范式&#xff0c;本文將全面剖析其核心特性及最佳實踐 一、ES6 簡介與背景 ECMAScript 6.0&#xff08;簡稱 ES6&#xff0…

CTF:網絡安全的實戰演練場

文章目錄 每日一句正能量前言一、CTF簡介&#xff08;一&#xff09;什么是CTF&#xff1f;&#xff08;二&#xff09;CTF的歷史 二、CTF比賽形式&#xff08;一&#xff09;線上賽&#xff08;Online CTF&#xff09;&#xff08;二&#xff09;線下賽&#xff08;Offline CT…

如何自定義一個 Spring Boot Starter?

導語&#xff1a; 在后端 Java 面試中&#xff0c;Spring Boot 是繞不開的重點&#xff0c;而“如何自定義一個 Starter”作為進階開發能力的體現&#xff0c;常被面試官用于考察候選人的工程架構思維與 Spring Boot 底層掌握程度。本文將帶你深入理解自定義 Starter 的實現邏輯…

大學課程:計算機科學與技術專業主要課程,是否落伍了?

計算機科學與技術 計算機科學與技術&#xff08;CS&#xff09;是一門涵蓋理論、系統、應用的綜合學科&#xff0c;其課程體系圍繞“計算機的底層原理、開發方法、技術創新”展開&#xff0c;既包含數學與理論基礎&#xff0c;也涉及工程實踐與前沿技術。以下是主要課程的分類…

docker-部署Nginx以及Tomcat

一、docker 部署Nginx 1、搜索鏡像&#xff08;nginx&#xff09; [rootlocalhost /]# docker search nginx Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": dial tcp 192.133.77.133:443: connect: connection refused 簡…

服務器信任質詢

NSURLSession 與 NSURLAuthenticationMethodServerTrust —— 從零開始的“服務器信任質詢”全流程 目標讀者&#xff1a;剛接觸 iOS 網絡開發、準備理解 HTTPS 與證書校驗細節的同學 出發點&#xff1a;搞清楚為什么會有“質詢”、質詢的觸發時機、以及在 delegate 里怎么正確…

MCP協議重構AI Agent生態:萬能插槽如何終結工具孤島?

前言 在人工智能技術快速發展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文協議)正逐漸成為AI Agent生態系統的關鍵基礎設施。這一由Anthropic主導的開放協議&#xff0c;旨在解決AI模型與外部工具和數據源之間的連接難題&#xff0c;被業界形象地稱…

測試 FreeSWITCH 的 mod_loopback

bgapi originate loopback/answer,park/default/inline park inline show channels as xml show calls as xml 有 2 個 channels 有 2 個 calls 比較有意思 在 loopback-a 是播放 wav 在 loopback-b 上可以錄音 這就是回環 有什么用呢&#xff1f; 除了做測試&#x…

三維GIS開發cesium智慧地鐵教程(4)城市白模加載與樣式控制

一、添加3D瓦片 <!-- 核心依賴引入 --> <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"><!-- 模型數據路徑 --> u…

Unity 中的顏色空間

一、顏色空間基本概念疑問 1、什么是顏色空間&#xff1f; 顏色空間是一個數學模型或系統&#xff0c;它定義了一套規則和方法&#xff0c;用來精確地描述、表示和組織顏色。? 可以把它想象成一個三維坐標系?&#xff08;或者有時更多維&#xff09; 每個維度代表一…

Mac下Android Studio掃描根目錄卡死問題記錄

環境信息 操作系統: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日構建) 問題現象 在項目開發過程中&#xff0c;提示一個依賴外部頭文件的cpp源文件需要同步&#xff0c;點…

Python----目標檢測(YOLO簡介)

一、 YOLO簡介 [YOLO](You Only Look Once&#xff09;是一種流行的物體檢測和圖像分割模型&#xff0c; 由華盛頓大學的約瑟夫-雷德蒙&#xff08;Joseph Redmon&#xff09;和阿里-法哈迪&#xff08;Ali Farhadi&#xff09;開發&#xff0c;YOLO 于 2015 年推出&#xff0c…

OLED(SSD306)移植全解-基于IIC

OLED&#xff08;SSD306&#xff09;移植全解-基于IIC 一&#xff0c;什么是oled?二&#xff0c;什么是IIC協議三&#xff0c;IIC通信流程&#xff1a;四&#xff0c;針對SSD1306的IIC通信流程&#xff08;結合芯片手冊版&#xff09;1&#xff0c;主機發送起始信號2&#xff…

LangChain【7】之工具創建和錯誤處理策略

文章目錄 一 LangChain 自定義工具概述二創建自定義工具的三種方法2.1 方法一&#xff1a;tool 裝飾器2.1.1 同步方法案例2.1.2 工具描述方式1&#xff1a;傳參2.1.3 工具描述方式2&#xff1a;文檔字符串 2.2 方法二&#xff1a;StructuredTool類2.2.1 StructuredTool創建自定…

【信息系統項目管理師-選擇真題】2025上半年(第二批)綜合知識答案和詳解(回憶版)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 【第1題】【第2題】【第3題】【第4題】【第5題】【第6題】【第7題】【第8題】【第9題】【第10題】【第11題】【第12題】【第13題】【第14題】【第15題】【第16題】【第17題】【第18題】【第19題】【第20題】【第…

「EN 18031」訪問控制機制(ACM - 1):智能路由器的安全守衛

家用路由器要是出口歐洲&#xff0c;可得留意歐盟EN18031標準里的訪問控制機制。以路由器為例&#xff0c;訪問控制機制&#xff08;ACM&#xff09;能決定誰能連入網絡、訪問哪些網站。比如通過設置不同的用戶角色和權限&#xff0c;家長可以限制孩子設備的上網時間和可訪問的…

關于項目多語言化任務的概述

今天的任務一個是關于多語言化的&#xff0c;也就是i18n&#xff0c;我需要做的呢首先是知道項目多語言是怎么實現的&#xff0c;一般情況下沒有多語言化這個功能的時候&#xff0c;我們會寫一個頁面&#xff0c;默認是英文&#xff0c;然后里面的文本都是英文&#xff0c;那么…

護網行動面試試題(2)

文章目錄 51、常見的安全工具有哪些&#xff1f;52、說說Nmap工具的使用&#xff1f;53、近幾年HW常見漏洞有哪些&#xff1f;54、HW 三&#xff08;四&#xff09;大洞56、獲得文件讀取漏洞&#xff0c;通常會讀哪些文件57、了解過反序列化漏洞嗎&#xff1f;58、常見的框架漏…