[數據結構]棧

1.棧的概念及結構

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

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

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

此圖來源與網絡

這里我們可以比作肉串,我們先把肉串好,后串上的肉,是先吃的.

2.棧的實現

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

這里我就用數組來實現一下,感興趣的可以用鏈表實現一下

個人感覺這個的寫法比較類似順序表

我們先創建棧,然后定義相應的功能

Stack.h#pragma once
// 支持動態增長的棧
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 
int StackEmpty(Stack* ps);
// 銷毀棧 
void StackDestroy(Stack* ps);

? ?注意:棧只能從后面入棧,從后面出棧.

#include"Stack.h"
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = data;ps->top++;
}
bool STEmpty(Stack* ps)
{assert(ps);return ps->top == 0;
}
void StackPop(Stack* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}
STDataType StackTop(Stack* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}
int STSize(Stack* ps)
{assert(ps);return ps->top;
}

最后我們來測試一下相關的功能

#include"Stack.h"
int main()
{Stack s;StackInit(&s);StackPush(&s, 1);StackPush(&s, 2);StackPush(&s, 3);int top = StackTop(&s);printf("%d ", top);StackPop(&s);StackPush(&s, 4);StackPush(&s, 5);while (!STEmpty(&s)){int top = StackTop(&s);printf("%d ", top);StackPop(&s);}StackDestroy(&s);return 0;
}

我們預期的結果是輸入的倒著的,所以結果應該是 3 5 4 2 1

我們運行一下:

所以這就是一個棧.


這會我們介紹了棧,并完成了相關的操作,如果有什么不懂,或者錯誤,歡迎指出.

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

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

相關文章

[ai筆記14] 周鴻祎的ai公開課筆記1

歡迎來到文思源想的ai空間,這是技術老兵重學ai以及成長思考的第14篇分享! 本周二月的最后一周,并不是閑下來了,反而是開始進行一些更多的深入實踐,關于gpt的主體架構、關于prompt,同時也看了不少書和直播&…

行業獨角獸—Matic Network來臨,成就百萬富翁的項目!

Matic Network由印度Bangalore及日本超級節點打造 ,獨創保險倉九倉共振循環模式。 Mtc于2023年初完成了700萬美元的種子輪融資, Paradigm領投,a16z、Variant、Solana Ventures和Jump Crypto參投,旨在全方位布局Web3.0的去中心化生…

web開發:如何用Echarts來自動給網頁設計各種統計圖

很多時候web開發也會需要用到統計圖,如果單純靠我們自己那點拙劣的css和js水平設計的話,又耗時間又做得跟史一樣,這時候就需要引入別人設計師為我們設計好的動態統計圖——echarts Echarts的官網是:Apache ECharts 1、第一步&…

Spring Boot整合Mybatis配置多數據源

Spring Boot 專欄:https://blog.csdn.net/dkbnull/category_9278145.html Spring Cloud 專欄:https://blog.csdn.net/dkbnull/category_9287932.html GitHub:https://github.com/dkbnull/SpringBootDemo Gitee:https://gitee.com/…

【HTML5】瀏覽器不能顯示字體報錯Failed to decode downloaded font問題解決

把網上的項目中字體通過鏈接保存下來在本地上使用,在本地服務器上運行站點發現,用Chrome瀏覽器訪問的時候,出現錯誤提示不能正常顯示字體,怎么解決呢,看看怎么搞。 文章目錄 發現問題提示警告提示錯誤 字體檢查打開文件…

【C++】每周一題——2024.3.3

題目 Cpp 【問題描述】 字符環(來源:NOI題庫)。有兩個由字符構成的環,請寫一個程序,計算這兩個字符環上最長公共字符串的長度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾連在一起,構成一個環&a…

k8s常見的命令集錦

Kubernetes(K8s)是一個開源的容器編排系統,它提供了一系列的命令行工具 kubectl 來管理和操作集群中的資源。以下是一些常見的 kubectl 命令集錦: kubectl get:用于獲取集群中的資源對象信息,如pods、nodes…

112.路徑總和

// 定義一個名為 Solution 的類 class Solution {// 定義一個名為 hasPathSum 的公共方法,接收一個 TreeNode 類型的根節點 root 和一個整數 targetSum 作為參數// 方法返回一個布爾值,表示從根節點開始是否存在一條路徑,使得路徑上所有節點的…

18個驚艷的可視化大屏(第12輯):智慧校園與教育方向

智慧校園可視化大屏通過數據可視化技術,將學校各個方面的數據信息進行展示,可以提高信息公開透明度、優化校園管理、提高學生教育質量和提高校內活動宣傳效果等。 1提高信息公開透明度: 通過大屏幕展示校園各個方面的數據信息,可…

mysql 字符串的拆分之 substring_index()函數

語法 substring_index(string,delimiter,number) string : 要分隔的字符串。 delimiter : 分隔符 number :分隔符位置 注意 number 可以為正數,也可以為負數。 正數時是指的是從左向右數,第 number 個分隔符左…

大唐杯學習筆記:Day3

1.1 SA組網和NSA組網 SA組網(非獨立組網)是指使能5G網絡不需要其他移動通信系統的輔助,可以獨立進行工作。NSA組網(獨立組網)是指使能5G網絡需要其他移動通信系統的輔助,如果輔助缺失,那么5G網絡不可以獨立進行工作,通常而言5G網絡建設階段,NSA組網方式是在表明5G網絡的使用需…

奔跑吧,前端er!前端五大方向技能羅列,webGL、AI、桌面、游戲

經常看到頭條上前端們爭論各種框架的優劣,然后相互爭吵不休,其實技術也好,框架也好,都是服務于項目需求的,爭論的鐵子們都站在自己的項目角度來品評工具,肯定是公說公有理婆說婆有理啦。 技術和框架是中性的…

編程之美_目錄

編程之美 0)0_0_常用函數庫 0)0_1_測試函數總結 1)1.1 數據結構之 數組 2)1.2 數據結構之 字符串 3)1.3 數據結構之 鏈表 4)1.4 數據結構之 隊列 5)1.5 數據結構之 棧 5)1.6 …

【latex】\IEEEpubid版權聲明與正文內容重疊

問題描述 撰寫IEEE Trans論文時,出現版權聲明文字\IEEEpubid與正文內容重疊的問題: 原因分析: 在使用模板時,不小心將以下命令刪除了: \IEEEpubidadjcol 解決方案: 在需要換頁的位置附近添加以上命令&…

在Jupyter-lab中使用RDKit畫分子2D圖

在Jupyter-lab中使用RDKit畫分子2D圖 在做完分子對接后,想看看篩選后的分子的結構。因此想利用Jupyter-lab來畫分子的2D圖。 1. 安裝Jupyter-lab與RDKit 系統:Win11已安裝conda RDKit 是一個功能強大、靈活易用的化學信息學工具包,廣泛應…

w30使用python調用shell腳本

使用python腳本去實現永恒之藍漏洞攻擊 實驗環境 攻擊工具:pythonmsfconsole 靶場:win7 和 kali實驗目的 演示python腳本調用過程 實驗步驟 1.寫一個永恒之藍的攻擊腳本,定義為blue.rc use exploit/windows/smb/ms17_010_eternalblue …

Spark(2)-基礎tranform算子(一)

一、算子列表 編號名稱1map算子2flatMap算子3filter算子4mapPartitions算子5mapPartitionsWithIndex算子6keys算子7values算子8mapValues算子9flatMaplValues算子10union算子11reducedByKey算子12combineByKey算子13groupByKey算子14foldByKey算子15aggregateByKey算子16Shuff…

深度學習工具之tokens計算器

1.什么是Token Token是GPT處理文本的基本單位。Token可以是一個字、一個詞語或特定語言中的一個字符。它們負責將輸入的文本數據轉換為 GPT 可以處理的數據格式。每個 GPT 模型都有一個預設的最大 Tokens 數量,例如,GPT-3 每次調用允許處理的最大 Token…

韋東山嵌入式Liunx入門驅動開發五

文章目錄 一、驅動程序基石1-1 休眠與喚醒1-2 POLL機制1-3 異步通知(1) 異步通知程序解析(2) 異步通知機制內核代碼詳解 1-4 阻塞與非阻塞1-5 定時器(1) 內核函數(2) 定時器時間單位 1-6 中斷下半部 tasklet 本人學習完韋老師的視頻,因此來復習鞏固,寫以…

華為OD技術面試案例7-2024年

記錄一下我面試od的面試過程. 1、第一個是hr電話面試, 其實也就是od的hr致電, 簡單了解一下個人情況, 問我要一些個人信息, 這塊沒啥問題; 2、第二個就是機考了, 根據我提供的信息, od的hr給我發了一個機考的鏈接, 并告訴我7天內有效, 可以在考試之前先刷刷題, 刷題地址參考…