初階數據結構(C語言實現)——4.1棧

目錄

  • 1.棧
    • 1.1棧的概念及結構
    • 1.2 棧的實現
      • 1.1.0 棧的初始化
      • 1.1.1 銷毀
      • 1.1.2 入棧
      • 1.1.3 出棧
      • 1.1.4 獲取棧中有效元素個數
      • 1.1.5 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
      • 1.1.6 獲取棧頂元素
      • 1.1.7 驗證
  • 附錄 棧的C語言實現源碼
    • .h文件
    • .c文件
    • test.c文件

1.棧

1.1棧的概念及結構

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

  • 壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
  • 出棧:棧的刪除操作叫做出棧。出數據也在棧頂

在這里插入圖片描述

1.2 棧的實現

在VS2022中新建一個工程

  • stack20250308.h(棧的類型定義、接口函數聲明、引用的頭文件)
  • stack20250308.c(棧的接口函數的實現)
  • stackTest20250308.c(主函數、測試各個接口功能)

在這里插入圖片描述

  • 實現接口
// 支持動態增長的棧
typedef int  STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
// 初始化棧
void STInit(ST* ps);
//銷毀
void STDestroy(ST* ps);
// 入棧,插入
void STPush(ST* ps, STDataType x);
// 出棧,刪除
void STPop(ST* ps);
//獲取棧中有效元素個數
int STSize(ST* ps);
//檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
bool STEmpty(ST* ps);
//獲取棧頂元素
STDataType STTop(ST* ps);

1.1.0 棧的初始化

在這里插入圖片描述

// 初始化棧
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType)*4);if (ps->a == NULL){perror("STInit::malloc fail!");return;}ps->capacity = 4;ps->top = 0;//top是棧頂元素的下一個位置//ps->top =-1;//top是棧頂元素位置
}

1.1.1 銷毀

//銷毀
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

1.1.2 入棧

// 入棧,插入
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tem = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);//擴容當前的2倍if (ps->a == NULL){perror("STInit::relloc fail!");return;}ps->a = tem;ps->capacity *= 2; //修改容量}ps->a[ps->top] = x;ps->top++;
}

1.1.3 出棧

// 出棧,刪除
void STPop(ST* ps){assert(ps);assert(!STEmpty(ps));//檢查是否為空,為空就報錯,ps->top--;//直接--,但是空棧的時候就不能繼續--,所以在之前進行是否為空的檢查。
}

1.1.4 獲取棧中有效元素個數

//獲取棧中有效元素個數
int STSize(ST* ps)
{assert(ps);//top就是sizereturn ps->top;
}

1.1.5 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0

//檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

1.1.6 獲取棧頂元素

//獲取棧頂元素
STDataType STTop(ST* ps)
{assert(ps);return ps->a[ps->top - 1];//top是最后一個元素的下一個位置,所以-1
}

1.1.7 驗證

  • 驗證的時候,我們棧是不能打印的,我們需要一個一個出棧打印棧頂元素
void STTest()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}STDestroy(&st);}

插入
在這里插入圖片描述

刪除
在這里插入圖片描述

棧有效個數驗證
在這里插入圖片描述

附錄 棧的C語言實現源碼

.h文件

#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>//靜態的
//#define N 10
//typedef struct Stack
//{
//	int a[N];
//	int top;
//
//}Stack;// 支持動態增長的棧
typedef int  STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
// 初始化棧
void STInit(ST* ps);
//銷毀
void STDestroy(ST* ps);
// 入棧,插入
void STPush(ST* ps, STDataType x);
// 出棧,刪除
void STPop(ST* ps);
//獲取棧中有效元素個數
int STSize(ST* ps);
//檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
bool STEmpty(ST* ps);
//獲取棧頂元素
STDataType STTop(ST* ps);

.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack20250308.h"// 初始化棧
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType)*4);if (ps->a == NULL){perror("STInit::malloc fail!");return;}ps->capacity = 4;ps->top = 0;//top是棧頂元素的下一個位置//ps->top =-1;//top是棧頂元素位置
}//銷毀
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}
// 入棧,插入
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tem = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);//擴容當前的2倍if (ps->a == NULL){perror("STInit::relloc fail!");return;}ps->a = tem;ps->capacity *= 2; //修改容量}ps->a[ps->top] = x;ps->top++;
}
// 出棧,刪除
void STPop(ST* ps){assert(ps);assert(!STEmpty(ps));//檢查是否為空,為空就報錯,ps->top--;//直接--,但是空棧的時候就不能繼續--,所以在之前進行是否為空的檢查。
}//獲取棧中有效元素個數
int STSize(ST* ps)
{assert(ps);//top就是sizereturn ps->top;
}
//檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//獲取棧頂元素
STDataType STTop(ST* ps)
{assert(ps);return ps->a[ps->top - 1];//top是最后一個元素的下一個位置,所以-1
}

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack20250308.h"void STTest()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);STPop(&st);STPop(&st);int size = STSize(&st);printf("棧有效元素為:%d\n", size);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}STDestroy(&st);
}int main()
{STTest();return 0;
}

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

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

相關文章

計算光學成像與光學計算概論

計算光學成像所涉及研究的內容非常廣泛&#xff0c;雖然計算光學成像的研究內容是發散的&#xff0c;但目的都是一致的&#xff1a;如何讓相機記錄到客觀實物更豐富的信息&#xff0c;延伸并擴展人眼的視覺感知。總的來說&#xff0c;計算光學成像現階段已經取得了很多令人振奮…

什么樣的物聯網框架適合開展共享自助KTV唱歌項目?

現在物聯網的廣泛應用&#xff0c;也讓更多用戶們看到了它的實力&#xff0c;也使得共享經濟遍地開花。其中共享自助唱歌設備也備受歡迎&#xff0c;那么適合開展共享自助KTV唱歌項目的物聯網框架都應具備哪些特點呢&#xff1f; 智能化與自動化管理 物聯網技術在共享KTV中的應…

機器視覺選型中,不同焦距的鏡頭成像視野有什么不同?

不同焦距的鏡頭成像視野的差異主要體現在視角范圍和透視效果上。焦距越長&#xff0c;視角越窄&#xff0c;能捕捉的景物范圍越小&#xff1b;焦距越短&#xff0c;視角越廣&#xff0c;覆蓋的景物范圍越大。以下是具體分析&#xff1a; 焦距與視角的關系 焦距&#xff08;Foc…

Linux16-數據庫、HTML

數據庫&#xff1a; 數據存儲&#xff1a; 變量、數組、鏈表-------------》內存 &#xff1a;程序運行結束、掉電數據丟失 文件 &#xff1a; 外存&#xff1a;程序運行結束、掉電數據不丟失 數據庫&#xff1a; …

開源訂貨系統哪個好 三大訂貨系統源碼推薦

在數字化轉型加速的今天&#xff0c;企業對訂貨系統的需求日益增長。一款優質的訂貨系統源碼不僅能提升供應鏈效率&#xff0c;還能通過二次開發滿足個性化業務需求。這里結合 “標準化、易擴展” 兩大核心要求&#xff0c;為您精選三款主流訂貨系統源碼&#xff0c;助您快速搭…

行為模式---迭代器模式

概念 迭代器模式是設計模式的行為模式&#xff0c;它的主要設計思想是提供一個可以操作聚合對象&#xff08;容器或者復雜數據類型&#xff09;表示&#xff08;迭代器類&#xff09;。通過迭代器類去訪問操作聚合對象可以隱藏內部表示&#xff0c;也可以使客戶端可以統一處理…

Maven的學習以及安裝配置 2024/3/1 idea

1. Maven的安裝 1.1 首先查看編程工具合適的Maven版本 我使用的是2024/3/1 版本的idea&#xff0c;接下來我會用這個版本的idea進行演示。idea沒有漢化的也可以參考我的步驟。 1、打開idea的設置&#xff0c;搜索Maven&#xff0c;進入Maven設置。 我們可以看到&#xff0c;…

基于 Docker 的跨平臺鏡像構建與增量更新實戰指南

引言&#xff1a;破解容器化兩大核心問題 在實際開發中&#xff0c;我們常常面臨兩個棘手問題&#xff1a; 跨平臺兼容性&#xff1a;如何在Windows平臺開發的鏡像&#xff0c;無縫運行在 ARM64 服務器&#xff1f;更新效率低下&#xff1a;每次代碼調整都要重新安裝全部依賴…

支付通道開通對接一般需要多少錢

不少老板都想開通AIP線上接口&#xff0c;但是不知道這個成本到底是多少? 其實目前第三方支付公司對外提供了標準的線上接入技術方案&#xff0c;一般以API、SDK等形式。因此&#xff0c;商戶在完成簽約審核后&#xff0c;可以順利拿到技術的密鑰&#xff0c;正常調用第三方支…

什么是 spring 的循環依賴?

什么是 spring 的循環依賴&#xff1f; 首先&#xff0c;認識一下什么是循環依賴&#xff0c;舉個例子&#xff1a;A 對象被 Spring 管理&#xff0c;并且引入的 B 對象&#xff0c;同樣的 B 對象也被 Spring 管理&#xff0c;并且也引入的 A 對象。這種相互被引用的情況&#…

thrift軟件、.thrif文件和thrift協議是什么關系,有什么用

Thrift軟件、.thrift文件和Thrift協議是Apache Thrift框架的三個核心組成部分&#xff0c;它們協同實現跨語言服務的高效開發與通信。以下是三者關系及作用的詳細解析&#xff1a; 一、核心組件關系 1. Thrift軟件&#xff08;框架&#xff09; ? 定位&#xff1a;Apache Th…

STM32旋轉編碼器驅動詳解:方向判斷、卡死處理與代碼分析 | 零基礎入門STM32第四十八步

主題內容教學目的/擴展視頻旋轉編碼器電路原理&#xff0c;跳線設置&#xff0c;結構分析。驅動程序與調用。熟悉電路和驅動程序。 師從洋桃電子&#xff0c;杜洋老師 &#x1f4d1;文章目錄 一、旋轉編碼器原理與驅動結構1.1 旋轉編碼器工作原理1.2 驅動程序結構 二、方向判斷…

elementplus的cascader級聯選擇器在懶加載且多選時的一些問題分析

1. 背景 在之前做的一個項目中使用到了element的級聯選擇器&#xff0c;并且是需要懶加載、多選、父子不關聯等等&#xff0c;在選的時候當然沒問題&#xff0c;但是回顯的時候就會回顯不出來&#xff0c;相信大部分伙伴都遇到過這個問題。我在以前出過一篇文章寫過關于級聯選…

【Python運維】用Python自動化AWS資源管理:利用boto3實現高效管理S3桶和EC2實例

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著云計算的普及,AWS(Amazon Web Services)已經成為許多企業和開發者首選的云平臺。為了提高工作效率,自動化管理AWS資源成為了一個熱…

淘寶關鍵字搜索接口爬蟲測試實戰指南

在電商數據分析和市場研究中&#xff0c;通過關鍵字搜索獲取淘寶商品信息是一項重要任務。淘寶開放平臺提供了 item_search 接口&#xff0c;允許開發者通過關鍵字搜索商品&#xff0c;并獲取商品列表及相關信息。本文將詳細介紹如何設計并測試一個基于該接口的爬蟲程序&#x…

【Linux實踐系列】:用c語言實現一個shell外殼程序

&#x1f525;本文專欄&#xff1a;Linux Linux實踐項目 &#x1f338;博主主頁&#xff1a;努力努力再努力wz 那么今天我們就要進入Linux的實踐環節&#xff0c;那么我們之前學習了進程控制相關的幾個知識點&#xff0c;比如進程的終止以及進程的等待和進程的替換&#xff0c;…

?算法OJ?N-皇后問題 II【回溯剪枝】(C++實現)N-Queens II

?算法OJ?N-皇后問題【回溯剪枝】&#xff08;C實現&#xff09;N-Queens 問題描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…

03.06 QT

一、使用QSlider設計一個進度條&#xff0c;并讓其通過線程自己動起來 程序代碼&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事項

以下是修改后的完整文檔&#xff0c;包含在多個多線程環境中使用 retain() 和 release() 方法的示例&#xff0c;且確保在 finally 塊中調用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息載體&#xff0c;其中 getP…

【CSS】Tailwind CSS 與傳統 CSS:設計理念與使用場景對比

1. 開發方式 1.1 傳統 CSS 手寫 CSS&#xff1a;你需要手動編寫 CSS 規則&#xff0c;定義類名、ID 或元素選擇器&#xff0c;并為每個元素編寫樣式。 分離式開發&#xff1a;HTML 和 CSS 通常是分離的&#xff0c;HTML 中通過類名或 ID 引用 CSS 文件中的樣式。 示例&#…