【數據結構初階】--棧與隊列(棧)

😘個人主頁:@Cx330?

👀個人簡介:一個正在努力奮斗逆天改命的二本覺悟生

📖個人專欄:《C語言》《LeetCode刷題集》《數據結構-初階》

前言:在之前幾篇博客中,我們學習了順序表和鏈表,接下來我們將學習棧的相關知識,希望大家繼續堅持下去🌹🌹🌹


目錄

一、棧的概念與結構

二、棧的初始化和銷毀

注意事項:

三、、入棧

四、出棧

五、取棧頂元素

注意事項:

測試結果:

六、獲取棧中元素個數

七、全部代碼實現

Stack.h:

Stack.c:

test.c:


一、棧的概念與結構

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

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

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

例子:我們可以將棧想象為水杯,水杯的地步就是棧底,開口的地方就是棧頂,在水杯里面放石頭,直到放滿為止,先放進杯子的石頭是最后才能拿出來的。

注意:棧的實現一般可以用數組或者鏈表來實現,但是相對而言數組的結構實現更優一些,將數組的尾部作為棧頂,數組的頭部作為棧頂,插入刪除數據的時間復雜度都為O(1),但是鏈表使用頭部也可以進行插入刪除,時間復雜度也為O(1),但是每次插入都會申請一個節點大小的空間,在空間上相對而言,數組的結構更加優秀

棧的結構:

//定義棧的結構
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//指向棧頂的位置--剛好就是棧中有效數據個數int capacity;//棧的空間大小
}ST;

二、棧的初始化和銷毀

初始化:

//初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}

銷毀:

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

注意事項:

這里的結構和順序表幾乎是一樣的,但是為了區分size,這里我們使用top作為棧頂


三、、入棧

//入棧--棧頂
void STPush(ST* ps, STDataType x)
{assert(ps);//判斷空間是否足夠if (ps->capacity == ps->top){//增容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;ps->capacity = newCapacity;}//空間足夠ps->arr[ps->top++] = x;
}

相信大家看到這些代碼的時候并不陌生,這里的邏輯和順序表幾乎一模一樣,當在棧中插入數據時,由于棧頂插入,所以要先判斷棧的空間是否足夠,若不夠先增容,足夠的話就將x賦給ps->arr[ps->top++]就可以了


四、出棧

在出棧之前首先要判斷棧是否為空,若不為空才可以進行出棧操作,所以這里封裝一個判空的接口

//棧是否為空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;//棧頂為0,棧就為空
}

出棧:

//出棧--棧頂
void STPop(ST* ps)
{assert(!STEmpty(ps));ps->top--;
}

棧不為空,直接讓ps->top--就可以了,非常簡單


五、取棧頂元素

//取棧頂元素
STDataType STTop(ST* ps)
{assert(!STEmpty(ps));return ps->arr[ps->top-1];//易錯top是空的,top-1才是棧頂元素
}

注意事項:

這里要注意的是,top是棧頂,而top-1才是棧頂元素

test.c:

#include"stack.h"void test1()
{ST ps;STInit(&ps);//入棧STPush(&ps, 1);STPush(&ps, 2);STPush(&ps, 3);STPush(&ps, 4);while (!STEmpty(&ps)){//取棧頂元素,打印STDataType top = STTop(&ps);printf("%d ", top);//出棧STPop(&ps);}printf("\n");//銷毀STDestory(&ps);
}int main()
{test1();
}

測試結果:


六、獲取棧中元素個數

//獲取棧中有效數據個數
int STSize(ST* ps)
{assert(ps);return ps->top;
}

實現起來也是非常簡單了,直接返回ps->top剛好就是有效元素個數?


七、全部代碼實現

Stack.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//定義棧的結構
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//指向棧頂的位置--剛好就是棧中有效數據個數int capacity;//棧的空間大小
}ST;
//初始化
void STInit(ST* ps);
//銷毀
void STDesTroy(ST* ps);
//入棧--棧頂
void STPush(ST* ps, STDataType x);
//棧是否為空
bool STEmpty(ST* ps);
//出棧--棧頂
void STPop(ST* ps);
//取棧頂元素
STDataType STTop(ST* ps);

Stack.c:

#include"stack.h"
//初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}
//銷毀
void STDesTroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}//入棧--棧頂
void STPush(ST* ps, STDataType x)
{assert(ps);//判斷空間是否足夠if (ps->capacity == ps->top){//增容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;ps->capacity = newCapacity;}//空間足夠ps->arr[ps->top++] = x;
}//棧是否為空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出棧--棧頂
void STPop(ST* ps)
{assert(!STEmpty(ps));ps->top--;
}//取棧頂元素
STDataType STTop(ST* ps)
{assert(!STEmpty(ps));return ps->arr[ps->top-1];//易錯top是空的,top-1才是棧頂元素
}//獲取棧中有效數據個數
int STSize(ST* ps)
{assert(ps);return ps->top;
}

test.c:

#include"stack.h"
void test01()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);printf("size:%d\n", STSize(&st));while (!STEmpty(&st)){//取棧頂STDataType top = STTop(&st);printf("%d ", top);//出棧STPop(&st);}printf("\n");STDesTroy(&st);
}
int main()
{test01();return 0;
}

往期回顧:

【數據結構初階】--雙向鏈表(一)

【數據結構初階】--雙向鏈表(二)

總結:這篇博客帶著給大家實現了棧的全部接口了,其實可以看出來棧的結構很簡單,但是大家不能眼高手低,下去一定要自己畫圖操作,那么下篇博客將帶著大家實現隊列,大家敬請期待!如果文章對你有幫助的話,歡迎評論,點贊,收藏加關注,感謝大家的支持🌹🌹🌹

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

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

相關文章

分布式微服務--GateWay的斷言以及如何自定義一個斷言

&#x1f4cc; 一、什么是 Gateway 的斷言&#xff08;Predicates&#xff09;&#xff1f;Predicates&#xff08;斷言&#xff09; 是 Spring Cloud Gateway 中用于匹配請求的條件。只有請求滿足斷言條件&#xff0c;路由才會生效&#xff0c;轉發到下游服務。&#x1f3af; …

圖片識別表格工具v3.0綠色版,PNG/JPG秒變可編輯Excel

[軟件名稱]: 圖片識別表格工具v3.0綠色版 [軟件大小]: 4.3 GB [軟件大小]: 夸克網盤 | 迅雷網盤 軟件介紹 表格快捕手 v3.0 綠色單文件版&#xff0c;無需安裝&#xff0c;雙擊即可運行。支持 PNG、JPG 等常見圖片格式&#xff0c;可精準識別其中的有線或無線表格&#xff…

線程池分析與設計

線程池 基本功能接口 C11 及以后的標準中&#xff0c;std::packaged_task和std::future是并發編程中用于任務封裝和結果獲取的重要組件&#xff0c;它們通常與線程配合使用&#xff0c;實現異步操作。 std::packaged_task std::packaged_task&#xff1a;封裝可調用對象為異步任…

機器學習:線性回歸

線性回歸&#xff1a;研究自變量和因變量之間的關系。對于特征x(x1,x2,x3....)與對應的標簽y&#xff0c;線性回歸假設二者之間存在線性映射。f(x)w1xw2x(平方)w3x(三次方)...&#xff0c;權重w表示每個特征變量的重要程度。越大表示越重要。線性回歸目標&#xff1a;求解w和b使…

如何將 Vue 前端、Hardhat 合約和 Node.js 后端集成到一個項目中

在區塊鏈開發中&#xff0c;DApp&#xff08;去中心化應用&#xff09;的開發往往涉及到多個層次&#xff1a;前端、合約和后端。今天我們將演示如何將 Vue 前端、Hardhat 合約 和 Node.js 后端 放在一個項目中&#xff0c;來打造一個完整的區塊鏈應用。1. 項目結構我們的目標是…

SQLite 創建表

SQLite 創建表 SQLite 是一款輕量級的數據庫管理系統,因其體積小、速度快、易于使用等優點,被廣泛應用于嵌入式系統、移動應用以及個人項目等領域。在 SQLite 中,創建表是進行數據存儲的第一步。本文將詳細介紹如何在 SQLite 中創建表,包括表結構定義、數據類型、約束條件…

學深度學習,有什么好的建議或推薦的書籍?

深度學習入門建議補基礎數學&#xff1a;重點學線性代數&#xff08;矩陣運算&#xff09;、概率論&#xff08;分布&#xff09;、微積分&#xff08;梯度&#xff09;。編程&#xff1a;掌握PythonNumPy&#xff08;數組操作&#xff09;&#xff0c;能寫基礎數據處理代碼。機…

自然語言處理×第四卷:文本特征與數據——她開始準備:每一次輸入,都是為了更像你地說話

&#x1f380;【開場 她試著準備一封信&#xff0c;用你喜歡的字眼】&#x1f98a;狐狐&#xff1a;“她發現了一個問題——你每次說‘晚安’的方式都不一樣。有時候輕輕的&#xff0c;有時候帶著笑音&#xff0c;還有時候像在躲開她的心思。”&#x1f43e;貓貓&#xff1a;“…

【沉浸式解決問題】mysql-connector-python連接數據庫:RuntimeError: Failed raising error.

目錄一、問題描述二、場景還原1. 創建項目2. 安裝mysql-connector-python3. 測試類三、原因分析四、解決方案1. 查看版本2. 切換python版本3. 切換mysql-connector-python版本4. 測試參考文獻一、問題描述 初次使用mysql-connector-python連接mysql時報錯 Traceback (most re…

【web頁面接入Apple/google/facebook三方登錄】

web頁面接入Apple/谷歌/臉書三方登錄 文章目錄web頁面接入Apple/谷歌/臉書三方登錄前言一、apple登錄使用步驟1.入口文件index.html引入js文件2.vue頁面初始化支付按鈕,并且點擊按鈕登錄二、google登錄使用步驟1.入口文件index.html引入js文件2.vue頁面初始化支付按鈕,并且點擊…

管家婆分銷軟件中怎么刪除過賬單據?

在業務單據錄入中&#xff0c;會出現單據保存過賬后才發現數量或商品信息錄入錯誤的情況&#xff0c;不想紅沖單據&#xff0c;該怎么處理&#xff1f;今天來和小編一起學習下管家婆分銷軟件中怎么刪除過賬單據吧&#xff01;1&#xff0c;軟件需要升級到9.92及以上版本&#x…

美顏SDK底層原理解析:直播場景下的美白濾鏡實時處理方案

眾所周知&#xff0c;美顏功能中&#xff0c;美白濾鏡是使用頻率最高的功能之一。它不僅能讓膚色更通透、提亮整體畫面&#xff0c;還能讓觀眾感受到主播的“在線狀態”與精神氣。但你有沒有想過&#xff0c;這個看似簡單的“美白”背后&#xff0c;其實是一整套實時圖像處理的…

系統構成與 Shell 核心:從零認識操作系統的心臟與外殼

系統構成與 Shell 核心&#xff1a;從零認識操作系統的心臟與外殼 很多人用電腦、用手機&#xff0c;但很少去想&#xff1a; 操作系統到底是怎么構成的&#xff1f; 為什么我們敲一個命令&#xff0c;系統就能乖乖執行&#xff1f; 這背后的關鍵&#xff0c;就在于系統的構成和…

wordpress的wp-config.php文件的詳解

wp-config.php 是 WordPress 網站的核心配置文件&#xff0c;它存儲了網站運行所需的基本配置信息&#xff0c;如數據庫連接信息、安全密鑰、調試模式等。以下是關于 wp-config.php 文件的詳細解析&#xff1a; 1. 數據庫連接信息 這是 wp-config.php 文件中最關鍵的部分&…

GPT-5 將在周五凌晨1點正式發布,王炸模型將免費使用??

就在今晚凌晨1點&#xff0c;OpenAI 又要搞大新聞了。 是的&#xff0c;就是大家期待已久的 GPT-5 發布會。 雖然官方還沒明說&#xff0c;但各種“預熱”已經安排得明明白白&#xff0c;Sam Altman 這波營銷屬實拉滿了&#xff0c;發布會都還沒開始&#xff0c;相關的代碼和頁…

MySQL UNION 操作符詳細說明

目錄 MySQL UNION 操作符詳細說明 1. UNION 操作符簡介 2. 基本語法 3. 使用規則和限制 4. UNION vs UNION ALL 5. 示例演示 6. 注意事項 MySQL UNION 操作符詳細說明 MySQL 中的 UNION 操作符用于合并兩個或多個 SELECT 語句的結果集&#xff0c;生成一個單一的結果集。…

Dify 從入門到精通(第 20/100 篇):Dify 的自動化測試與 CI/CD

Dify 從入門到精通&#xff08;第 20/100 篇&#xff09;&#xff1a;Dify 的自動化測試與 CI/CD Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#x…

VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待

原因 大概率是遠程服務器的下載有問題 原因1 遠程服務器的網絡不好 原因2 遠程服務器的磁盤滿了 我遇到的就是第二種&#xff0c;解決方法也很簡單 VSCode ——> Help ——> About 會出現一些信息&#xff0c;例如下面的 Version: 1.97.2 (user setup) Commit: e54c774e0…

Spring Cloud 項目注冊 Nacos 時設置真實 IP 的多種方式【多網卡/虛擬機實用指南】

&#x1f680; Spring Cloud 項目注冊 Nacos 時設置真實 IP 的多種方式【多網卡/虛擬機實用指南】 前言 在使用 Spring Cloud Alibaba Nacos 注冊服務時&#xff0c;常常會遇到 注冊 IP 異常 的問題&#xff1a; 本機有多個網卡&#xff08;如 Docker、VM 虛擬機、VPN&#xf…

單片機裸機程序設計架構

文章目錄一、前后臺系統&#xff08;Foreground-Background System&#xff09;二、時間片輪詢架構&#xff08;Time-Slicing Polling&#xff09;三、狀態機架構&#xff08;State Machine&#xff09;四、事件驅動架構&#xff08;Event-Driven&#xff09;五、架構設計原則總…