數據結構-棧(帶圖)

目錄

棧的概念

畫圖理解棧

棧的實現

fun.h

fun.c

main.c


棧的概念

棧(Stack)是一種基本的數據結構,其特點是只允許在同一端進行插入和刪除操作,這一端被稱為棧頂。遵循后進先出(Last In, First Out, LIFO)原則,即最后存入棧中的元素最先被取出。形象地講,棧就像是生活中堆放盤子的架子,我們總是把新的盤子放在最上面,而需要拿盤子時也是從最上面開始拿。

生活中就有棧的一些例子比如這些圖片:

棧的基本操作包括

  1. 壓棧(Push):向棧頂添加一個元素。相當于在堆疊的頂部放入一個新的物品。
  2. 出棧(Pop):從棧頂移除一個元素,并可選擇返回這個元素。這類似于從堆疊頂部移走最上面的物品。
  3. 查看棧頂元素(Peek/Top):獲取棧頂的元素但不移除它,用于檢查或獲取棧頂的信息。
  4. 判斷棧是否為空(IsEmpty):檢查棧中是否有元素。
  5. 獲取棧的大小(Size):返回棧中元素的數量

畫圖理解棧

首先我們棧有一個原理:先進后出,后進先出,于是我們得得到這么個圖


開始壓棧,壓棧的同時我們的p指針也要同時往后面走


最總


出棧


依次出棧后

這里為什么會1 2 3 4壓棧出棧后變成了4321?

其實正確的壓棧出棧我們需要邊壓棧邊出棧就不會出現這種情況了,所以我main函數中是這樣寫的

int main1() {Stack p;STInit(&p);//初始化棧StackPush(&p, 1);//壓棧StackPop(&p);//出棧printf("%d\n", p.a[p.top]);StackPush(&p, 2);StackPop(&p);printf("%d\n", p.a[p.top]);StackPush(&p, 3);StackPop(&p);printf("%d\n", p.a[p.top]);	
}

棧的實現

接下來我們用代碼實現棧,這里我用了三個文件,解析都在注釋中

fun.h

這個文件里有我實現了棧的一些功能

#pragma once
//頭文件
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#include<assert.h>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 
bool StackEmpty(Stack* ps);
// 銷毀棧 
void StackDestroy(Stack* ps);

fun.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"fun.h"//擴容函數
void Exp(Stack* p) {if (p->capacity == p->top){//利用三目運算來判斷是否int New_cap = p->capacity == 0 ? 4 : p->capacity * 2;STDataType* tmp = (STDataType*)realloc(p->a, New_cap * sizeof(STDataType));if (tmp == NULL){assert("realloc");return;}//將開辟空間給給原來的變量p->a = tmp;p->capacity = New_cap;}
}//初始化
void StackInit(Stack* p) {assert(p);p->a = NULL;p->capacity = p->top = 0;
}
// 入棧 
void StackPush(Stack* p, STDataType data){assert(p);//判斷空間Exp(p);//入棧p->a[p->top] = data;//入棧后棧頂向上移動p->top++;
}
//出棧
void StackPop(Stack* p) {assert(p);assert(p->top > 0);//確保不為空//判斷是否元素是否為0,避免越界 /*if (p->top == 0){return;}*/p->top--;
}
// 獲取棧頂元素 
STDataType StackTop(Stack* p) {//判斷是否為0if (p->top == 0){return (STDataType)0;//由于返回類型是 STDataType,所以需要強制轉換}return p->a[p->top - 1];
}
// 獲取棧中有效元素個數 
int StackSize(Stack* p) {return p->top;}
//判空
bool StackEmpty(Stack* p) {// 使用邏輯非操作符(!)來檢查棧頂指針(top)是否為0(即棧是否為空)// 如果top為0,說明棧中沒有任何元素,因此棧是空的// 在C語言中,邏輯非操作符會將0轉換為1(true),非0轉換為0(false)// 所以當棧頂指針top為0時,!p->top的結果為true(非零值),表示棧為空// 反之,如果棧中有元素(top非0),則!p->top的結果為false(0),表示棧非空return !p->top;
}
// 銷毀棧 
void StackDestroy(Stack* p) {if (p->a){free(p->a);p->a = NULL;p->capacity = p->top = 0;}
}

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"fun.h"
//
//int main1() {
//	Stack p;
//	STInit(&p);
//	StackPush(&p, 1);
//	StackPop(&p);
//	printf("%d\n", p.a[p.top]);
//	StackPush(&p, 2);
//	StackPop(&p);
//	printf("%d\n", p.a[p.top]);
//	StackPush(&p, 3);
//	StackPop(&p);
//	printf("%d\n", p.a[p.top]);
//	
//	
//}int main() { Stack s1;StackInit(&s1);StackPush(&s1, 1);StackPush(&s1, 2);printf("棧中元素個數:%d個\n", StackSize(&s1));while (!StackEmpty(&s1)){printf("%d\n", StackTop(&s1));StackPop(&s1);}printf("棧中元素個數:%d個", StackSize(&s1));StackDestroy(&s1);
}

這個數據結構比較簡單,里面的很多方法,都是和順序表差不多,不懂得鐵鐵可以去看一下我前面的博客

數據結構:順序表-CSDN博客文章瀏覽閱讀838次,點贊18次,收藏9次。數據是計算機科學中的基本概念,它代表了在計算機程序中處理的一切信息內容。https://blog.csdn.net/2302_78381559/article/details/137435691這邊可能你還是不是很理解棧,我們可以試著做一道Leetcode的題,來感受一下棧

題的鏈接

20. 有效的括號 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/description/

我對這道題理解之后寫的一篇博客,供大家觀看

20. 有效的括號 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/description/

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

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

相關文章

瀏覽器下載附件流建議

大文件下載可采用附件流的方式&#xff0c;后端設置一下響應參數&#xff0c;然后以流的方式返回前端 res.set({ "Content-Type": "application/octet-stream", "Content-Disposition": "attachment;filename* UTF-8"fixedEncodeUR…

【論文粗讀|arXiv】GaSpCT: Gaussian Splatting for Novel CT Projection View Synthesis

Abstract 本文提出了一種新穎的視圖合成和3D場景表示方法&#xff0c;用于為計算機斷層掃描&#xff08;CT&#xff09;生成新的投影視圖。 方法采用了Gaussian Splatting 框架&#xff0c;基于有限的2D圖像投影集&#xff0c;無需運動結構&#xff08;SfM&#xff09;方法&am…

CSPM-4是什么?報考條件有哪些?

2021年10月&#xff0c;《國家標準化發展綱要》明確提出構建多層次從業人員培養培訓體系&#xff0c;開展專業人才培養培訓和國家質量基礎設施綜合教育。建立健全人才的職業能力評價和激勵機制。由中國標準化協會&#xff08;CAS&#xff09;組織開展的項目管理專業人員能力評價…

Swift 5.9 中 if 與 switch 語句簡潔新語法讓擼碼更帶勁

概覽 在實際代碼開發中&#xff0c;可能初學 Swift 語言的小伙伴們在擼碼時最常用的得數 if 和 switch…case 條件選擇語句了。不過在某些場景下它們顯得略有那么一丟丟“矯揉造作”&#xff0c;還好從 Swift 5.9 開始蘋果知趣的為其簡化了語法且增強了它們的表現力。 在本篇…

Vitis HLS 學習筆記--優化本地存儲器訪問瓶頸

目錄 1. 簡介 2. 代碼解析 2.1 原始代碼 2.2 優化后 2.3 分析優化措施 3. 總結 1. 簡介 在Vitis HLS中&#xff0c;實現II&#xff08;迭代間隔&#xff09; 1是提高循環執行效率的關鍵。II1意味著每個時鐘周期都可以開始一個新的迭代&#xff0c;這是最理想的情況&…

Java實現音頻轉文本(語音識別)

在Java中實現音頻轉文本&#xff08;也稱為語音識別或ASR&#xff09;通常涉及使用專門的語音識別服務&#xff0c;如Google Cloud Speech-to-Text、IBM Watson Speech to Text、Amazon Transcribe、Microsoft Azure Speech Services&#xff0c;或者一些開源庫如CMU Sphinx。 …

2024年第四屆長三角高校數學建模競賽C題思路

賽道C:汽后配件需求預測問題 在汽后行業的供應鏈管理中, 精準的需求預測是后續管理及決策的基礎。 各個汽后配件即為一個庫存單位(SKU, Stock Keeping Unit), 如果可以準確預知未來對于各個配件的市場需求, 就可以提前將庫存放在靠近需求的倉庫中, 從而降低庫存成本,…

HNCTF ——baby_python

H&NCTF 2024 官方WP (qq.com) OpCodes Pickle.jl (juliahub.com) nc之后 PS D:\ForCode\pythoncode\.idea> nc hnctf.yuanshen.life 33267 # Python 3.10.12 from pickle import loads main b"\x80\x04ctypes\nFunctionType\n(ctypes\nCodeType\n(I1\nI0\nI0\n…

[Linux] 常用服務器命令(持續更新)

文件操作 # 顯示文件系統的磁盤空間使用情況 df -h全局查找文件 find / -type f -iname "java"find / -name libncurses*拷貝整個文件夾 cp -r /home/a/ /home/b/ 解壓&#xff0c;撤銷解壓 撤銷zip解壓 zipinfo -1 path/xx.zip | xargs rm -rf 撤銷tar解壓 tar …

【Vim】

一、什么是Vim&#xff1f; Vim 是一個歷史悠久的文本編輯器&#xff0c;可以追溯到 qed。 Bram Moolenaar 于 1991 年發布初始版本。Vim 有著悠久的歷史;它起源于 Vi 編輯器&#xff08;1976 年&#xff09;&#xff0c;至今仍在開發中。(Vim has a rich history; it origina…

css+html 愛心?

效果 代碼實現 html <div class"main"><div class"aixin"></div></div>css .main {transform: rotate(-45deg);}.aixin {height: 100px;width: 100px;background-color: red;margin: auto;margin-top: 200px;position: relativ…

MySQL第一次作業(基本操作)

目錄 一、登陸數據庫 二、創建數據庫zoo 三、修改數據庫zoo字符集為gbk 四、選擇當前數據庫為zoo 五、查看創建數據庫zoo信息 六、刪除數據庫zoo 一、登陸數據庫 指令&#xff1a; mysql -u root -p 二、創建數據庫zoo 指令&#xff1a; create database zoo; 三、修改數…

基于PHP+MySQL組合開發的多用戶自定義商城系統源碼 附帶源代碼包以及搭建教程

系統概述 互聯網技術的飛速發展&#xff0c;電子商務已成為人們日常生活中不可或缺的一部分。商城系統作為電子商務的核心&#xff0c;其開發技術和用戶體驗直接影響著電商平臺的競爭力和用戶滿意度。本文旨在介紹一個基于PHPMySQL組合開發的多用戶自定義商城系統&#xff0c;…

C++學習~~string類

1.STL簡單介紹 &#xff08;1&#xff09;標準模版庫&#xff0c;是C里面的標準庫的一部分&#xff0c;C標準庫里面還有其他的東西&#xff0c;但是我們不經常使用&#xff0c;我們經常使用的還是STL這個標準庫部分。 &#xff08;2&#xff09;六大件&#xff1a;仿函數&…

C# WinForm —— 16 MonthCalendar 介紹

1. 簡介 可以選擇單個日期&#xff0c;也可以選擇一段日期&#xff0c;在選擇時間范圍上 比較適用&#xff0c;但不能跨月份選擇日期范圍 在直觀上&#xff0c;可以快速查看、選擇日期/日期范圍 2. 常用屬性 屬性解釋(Name)控件ID&#xff0c;在代碼里引用的時候會用到,一般…

Uni-app基礎知識

uni-app組成和跨端原理 | uni-app官網uni-app,uniCloud,serverless,uni-app組成和跨端原理,基本語言和開發規范,編譯器,運行時&#xff08;runtime&#xff09;,邏輯層和渲染層分離https://uniapp.dcloud.net.cn/tutorial/1.adb連接模擬器 找到adb所在位置&#xff08;一般在hb…

C++ 程序員常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (簡體中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

一網打進Linux下那些查找命令

查找是我們每天都在做的事情&#xff0c;早上醒來找下手機&#xff0c;出門之前查下公交&#xff0c;坐下之后查下資料&#xff0c;分析數據查下模式。 查找文件&#xff0c;查找信息&#xff0c;查找錯誤是應用起來更為具體的一些工作&#xff0c;而Linux命令行為我們提供了很…

對稱加密算法的應用場景

隨著信息技術的飛速發展&#xff0c;數據安全成為了至關重要的議題。在保護數據傳輸和存儲的過程中&#xff0c;加密算法扮演著不可或缺的角色。其中&#xff0c;對稱加密算法&#xff0c;由于其高效性和易用性&#xff0c;被廣泛應用于各種場景中。本文將探討對稱加密算法的主…

Kubernets多master集群構建負載均衡

前言 在構建 Kubernetes 多 Master 集群時&#xff0c;實現負載均衡是至關重要的一環。通過多臺 Master 節點配合使用 Nginx 和 Keepalived 等工具&#xff0c;可以有效提高集群的可靠性和穩定性&#xff0c;確保系統能夠高效運行并有效應對故障。接下來將介紹如何配置這些組件…