C語言_數據結構總結5:順序棧

純C語言代碼,不涉及C++

想了解鏈式棧的實現,歡迎查看這篇文章:C語言_數據結構總結6:鏈式棧-CSDN博客

這里分享插入一下個人覺得很有用的習慣:

1. 就是遇到代碼哪里不理解的,你就問豆包,C知道,Kimi等等AI工具,比如在這棧中你不能理解為什么有時候要傳一級指針有時候又不用,你就詢問AI“在進棧操作中是否可以不傳入指針變量,而是直接傳入結構體變量”;

2. 還有就是自己的代碼報錯了,又或是自己覺得自己的代碼存在某種問題,而自己又不能解決時,你就直接復制自己的代碼問AI,讓AI對以下代碼進行點評,并返回改善后的代碼。

前言

:是只允許在一端進行插入或刪除操作的線性表。
棧頂:允許進行插入或刪除的那一端
棧底:固定的,不允許進行插入或刪除的那一端
棧的特性后進先出
存儲方式:1. 順序存儲(順序棧) ?2. 鏈式存儲(鏈式棧)

? ? ? ?在順序棧的基本操作中,決定是傳入一級指針還是只傳入棧的變量,主要取決于操作是否需要修改棧的內部狀態
?? ?1. 需要傳入一級指針的情況
?? ?當操作需要修改棧的內部狀態,比如改變棧頂指針 top 的值或者修改棧中存儲的數據時,就需要傳入一級指針。
?? ?這是因為在 C 語言里,函數參數傳遞是值傳遞,若直接傳入棧的變量,函數內部對該變量的修改不會影響到原變量。
?? ?而通過傳入指針,函數可以直接訪問和修改原變量所指向的內存。

?? ?2. 只需要傳入棧的變量的情況
?? ?當操作不需要修改棧的內部狀態,僅僅是讀取棧的信息時,就可以只傳入棧的變量。

以下是順序棧實現
它利用一組地址連續的存儲單元存放自棧底到棧頂的數據元素,同時附設一個指針top指示當前的棧頂元素的位置

0. 結構單元

#define MaxSize 50
typedef int ElemType;
typedef struct SqStack {
?? ?ElemType data[MaxSize]; ?//存放棧中元素
?? ?int top; ?//棧頂指針
}SqStack;

!注意??:棧頂指針top,它不是實際意義上的指針變量,進行存放指針變量。這里說它是指針,意思是說,它指示了當前棧頂元素的位置,在第pos個位置。

1. 初始化

void InitSeqStack(SqStack* s) {s->top = -1;  //初始化棧頂的位置
}

這里設置初始棧頂指針s.top = -1,
棧空條件是s.top = -1;棧滿條件是s.top = MaxSize - 1
則進棧時指針s.top+1,再將元素加入棧頂;出棧時先取出棧頂元素,后指針s.top - 1

但如果設置初始棧頂指針s.top = 0,
棧空條件是s.top = 0;棧滿條件是s.top = MaxSize
則進棧時將元素加入棧頂,再指針s.top+1;出棧時先指針s.top - 1,后取出棧頂元素

2. 判空

int SqStackEmpty(SqStack s) {return s.top == -1;
}

3. 判滿

int SqStackFull(SqStack s) {return s.top == MaxSize - 1;
}

4. 入棧

即:將元素加入到棧頂

int push(SqStack* s, ElemType value) {// 1. 判滿if (SqStackFull(*s)){printf("棧滿,無法入棧!\n");return -2;}// 2. 指針top + 1,再將值加入到棧頂s->top++;s->data[s->top] = value;return 0;  //入棧成功
}

5. 出棧

int pop(SqStack* s, ElemType* value) {//1. 判空if (SqStackEmpty(*s)){printf("棧空,無法有元素出棧!\n");return -1;}//2. 先取出棧頂元素,再指針top - 1*value = s->data[s->top];s->top--;return 0;  //出棧成功
}

6. 獲取棧頂元素

int getTop(SqStack s,ElemType *value) {//1. 判空if (SqStackEmpty(s)){printf("棧空,無法有元素出棧!\n");return -1;}//2. 獲取棧頂元素*value = s.data[s.top];return 0;  
}

7. 打印棧中元素

void printSqStack(SqStack s) {if (SqStackEmpty(s)){printf("棧空!\n");return;  //提前結束該函數}printf("棧中的元素(從棧底到棧頂)為: ");for (int i = 0; i <= s.top; i++) {printf("%d ", s.data[i]);}printf("\n");
}

8. 銷毀

void destroySqStack(SqStack* s) {// 由于順序棧使用的是靜態數組,不需要顯式釋放內存// 只需要將棧頂指針置為 -1 表示棧為空s->top = -1;
}

9. 測試

int main() {SqStack s;InitSeqStack(&s);// 測試入棧操作push(&s, 11);push(&s, 22);push(&s, 33);printSqStack(s);  // 棧中的元素(從棧底到棧頂)為: 11 22 33// 獲取棧頂元素ElemType value;if (getTop(s,&value) == 0){printf("當前棧頂元素為:%d\n", value); // 當前棧頂元素為:33}//測試出棧操作if (pop(&s,&value) == 0){printf("出棧的元素為:%d\n", value);  // 出棧的元素為:33}printSqStack(s);  // 棧中的元素(從棧底到棧頂)為: 11 22//銷毀棧destroySqStack(&s);printSqStack(s);  // 棧空!return 0;
}

10. 完整代碼

#include<stdio.h>
#include<stdlib.h>
/*棧:是只允許在一端進行插入或刪除操作的線性表。棧頂:允許進行插入或刪除的那一端棧底:固定的,不允許進行插入或刪除的那一端棧的特性:后進先出存儲方式:1. 順序存儲(順序棧)  2. 鏈式存儲(鏈式棧)
*//*在順序棧的基本操作中,決定是傳入一級指針還是只傳入棧的變量,主要取決于操作是否需要修改棧的內部狀態。1. 需要傳入一級指針的情況當操作需要修改棧的內部狀態,比如改變棧頂指針 top 的值或者修改棧中存儲的數據時,就需要傳入一級指針。這是因為在 C 語言里,函數參數傳遞是值傳遞,若直接傳入棧的變量,函數內部對該變量的修改不會影響到原變量。而通過傳入指針,函數可以直接訪問和修改原變量所指向的內存。2. 只需要傳入棧的變量的情況當操作不需要修改棧的內部狀態,僅僅是讀取棧的信息時,就可以只傳入棧的變量。*//*以下是順序棧實現它利用一組地址連續的存儲單元存放自棧底到棧頂的數據元素,同時附設一個指針top指示當前的棧頂元素的位置
*/#define MaxSize 50
typedef int ElemType;
typedef struct SqStack {ElemType data[MaxSize];  //存放棧中元素int top;  //棧頂指針(注意,它不是實際意義上的指針變量,進行存放指針變量。這里說它是指針,意思是說,它指示了當前棧頂元素的位置,在第pos個位置。
}SqStack;// 操作1——初始化
void InitSeqStack(SqStack* s) {s->top = -1;  //初始化棧頂的位置
}/*這里設置初始棧頂指針s.top = -1,棧空條件是s.top = -1;棧滿條件是s.top = MaxSize - 1則進棧時指針s.top+1,再將元素加入棧頂;出棧時先取出棧頂元素,后指針s.top - 1但如果設置初始棧頂指針s.top = 0,棧空條件是s.top = 0;棧滿條件是s.top = MaxSize則進棧時將元素加入棧頂,再指針s.top+1;出棧時先指針s.top - 1,后取出棧頂元素	
*/// 操作2——判空
int SqStackEmpty(SqStack s) {return s.top == -1;
}// 操作3——判滿
int SqStackFull(SqStack s) {return s.top == MaxSize - 1;
}// 操作4——入棧,將元素加到棧頂
int push(SqStack* s, ElemType value) {// 1. 判滿if (SqStackFull(*s)){printf("棧滿,無法入棧!\n");return -2;}// 2. 指針top + 1,再將值加入到棧頂s->top++;s->data[s->top] = value;return 0;  //入棧成功
}// 操作5——出棧
int pop(SqStack* s, ElemType* value) {//1. 判空if (SqStackEmpty(*s)){printf("棧空,無法有元素出棧!\n");return -1;}//2. 先取出棧頂元素,再指針top - 1*value = s->data[s->top];s->top--;return 0;  //出棧成功
}// 操作6——獲取棧頂元素
int getTop(SqStack s,ElemType *value) {//1. 判空if (SqStackEmpty(s)){printf("棧空,無法有元素出棧!\n");return -1;}//2. 獲取棧頂元素*value = s.data[s.top];return 0;  
}// 操作7——打印棧中元素
void printSqStack(SqStack s) {if (SqStackEmpty(s)){printf("棧空!\n");return;  //提前結束該函數}printf("棧中的元素(從棧底到棧頂)為: ");for (int i = 0; i <= s.top; i++) {printf("%d ", s.data[i]);}printf("\n");
}// 操作8——銷毀棧
void destroySqStack(SqStack* s) {// 由于順序棧使用的是靜態數組,不需要顯式釋放內存// 只需要將棧頂指針置為 -1 表示棧為空s->top = -1;
}int main() {SqStack s;InitSeqStack(&s);// 測試入棧操作push(&s, 11);push(&s, 22);push(&s, 33);printSqStack(s);  // 棧中的元素(從棧底到棧頂)為: 11 22 33// 獲取棧頂元素ElemType value;if (getTop(s,&value) == 0){printf("當前棧頂元素為:%d\n", value); // 當前棧頂元素為:33}//測試出棧操作if (pop(&s,&value) == 0){printf("出棧的元素為:%d\n", value);  // 出棧的元素為:33}printSqStack(s);  // 棧中的元素(從棧底到棧頂)為: 11 22//銷毀棧destroySqStack(&s);printSqStack(s);  // 棧空!return 0;
}

11. 運行截圖

本人菜鳥一只,文章如有出錯處,歡迎評論區指正!

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

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

相關文章

2021 年 6 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 波蘭表達式T2. 多項式相加思路分析T3. 撲克牌排序思路分析T4. 表達式求值思路分析T1. 波蘭表達式 題目鏈接:SOJ D1087 此題為 2023 年 12 月三級第三題原題,見 2023 年 12 月青少年軟編等考 C 語言三級真題解析中的 T3。 T2. 多項式相加 題目鏈接:SOJ D1088 我…

AI數字人| Fay開源項目、UE5數字人、本地大模型

數字人實踐教程 本教程主要是講如何在本地UE部署Fay數字人的開源框架。 最終效果可以與人進行自然語言的對話&#xff0c;花了大概10個h的時間到&#xff0c;踩了很多坑&#xff0c;同樣想實現的朋友可以作為參考 參考文檔&#xff1a;Fay 數字人開源框架 - 飛書云文檔 官方的教…

網絡版漢譯英服務(muduo)

文章目錄 網絡版漢譯英服務&#xff08;muduo&#xff09;muduo庫muduo 庫是什么muduo 庫常見接口介紹muduo::net::EventLoopmuduo::net::TcpConnectionmuduo::net::TcpServermuduo::net::TcpClientmuduo::net::Buffer 漢譯英服務服務端客戶端 網絡版漢譯英服務&#xff08;mud…

在ArcMap中通過Python編寫自定義工具(Python Toolbox)實現點轉線工具

文章目錄 一、需求二、實現過程2.1、創建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog測試代碼2.3、在ArcMap中使用工具 三、測試 一、需求 通過插件的形式將點轉線功能嵌入ArcMap界面&#xff0c;如何從零開始創建一個插件&#xff0c;包括按鈕的添加、工具的實…

C++之序列容器(vector,list,dueqe)

1.大體對比 在軟件開發的漫長歷程中&#xff0c;數據結構與算法始終占據著核心地位&#xff0c;猶如大廈的基石&#xff0c;穩固支撐著整個程序的運行。在眾多編程語言中&#xff0c;數據的存儲與管理方式各有千秋&#xff0c;而 C 憑借其豐富且強大的工具集脫穎而出&#xff…

【學習筆記】【DeepSeek AI 醫生】2-2 AI家庭醫生課程內容介紹

【DeepSeek AI 醫生】2-4 項目詳細分析及DeepSeek適用場景 一、Ollama部署二、可視化UI三、構建項目環境四、搭建項目架構五、Spring Al六、SSE服務端推送事件七、數據持久化八、線上部署 一、Ollama部署 Mac部署windows 部署ollama腳本、常用命令DeepSeek 提示詞、角色、適用…

STM32 I2C驅動開發全解析:從理論到實戰 | 零基礎入門STM32第五十步

主題內容教學目的/擴展視頻I2C總線電路原理&#xff0c;跳線設置&#xff0c;I2C協議分析。驅動程序與調用。熟悉I2C總線協議&#xff0c;熟練調用。 師從洋桃電子&#xff0c;杜洋老師 &#x1f4d1;文章目錄 引言一、I2C驅動分層架構二、I2C總線驅動代碼精析2.1 初始化配置&a…

Vercel Serverless

1. 引言 現代應用程序是為適應當前技術環境需求而設計的軟件&#xff0c;采用現代開發工具和實踐&#xff0c;針對云部署和可擴展性優化。它們由多個模塊化小組件組成&#xff0c;便于集成和縮放&#xff0c;具有高度的敏捷性和適應性&#xff0c;能快速響應用戶或業務需求變化…

國產操作系統之系統分區及分區的作用

國產操作系統之系統分區及分區的作用和掛載 Linux的系統分區跟Windows有著本質區別,在windows中大家知道c盤一般為系統盤,除c盤系統盤外,我們再分為D、E等文件存儲盤,而在Linux中雖然是以文件目錄著稱的系統,但思路也一樣的,比如針對系統分區中 /home、/var 和 /opt 等文…

字節碼是由什么組成的?

Java字節碼是Java程序編譯后的中間產物&#xff0c;它是一種二進制格式的代碼&#xff0c;可以在Java虛擬機&#xff08;JVM&#xff09;上運行。理解字節碼的組成有助于我們更好地理解Java程序的運行機制。 1. Java字節碼是什么&#xff1f; 定義 Java字節碼是Java源代碼經過…

微前端框架 Qiankun 的應用及問題分析

一、Qiankun 的核心應用場景與優勢 多技術棧共存與靈活集成 Qiankun 支持主應用與子應用使用不同技術棧&#xff08;如 Vue、React、Angular 等&#xff09;&#xff0c;通過 HTML Entry 方式接入子應用&#xff0c;無需深度改造子應用即可實現集成&#xff0c;降低了技術遷移成…

function uuid_generate_v4()不存在(二)

說明&#xff1a;之前代碼里用到了postgresql內嵌函數uid_generate_v4()生成記錄的主鍵&#xff0c;提示該函數不存在&#xff0c;寫了下面這篇博客記錄了一下&#xff0c;今天又發現了新的問題&#xff0c;于是補充了這篇博客。 function uuid_generate_v4()不存在&#xff0…

6. 機器人實現遠程遙控(具身智能機器人套件)

1. 啟動控制腳本 遠程作到 Raspberry Pi 中&#xff0c;并運行以下腳本&#xff1a; conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登錄筆記本電腦上&#xff0c;同時運行以下腳本&#xff1a; conda ac…

【簡單的C++圍棋游戲開發示例】

C圍棋游戲開發簡單示例&#xff08;控制臺版&#xff09; ?核心代碼實現? #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 簡化棋盤為9x9?:ml-citation{ref"1" data"citationList&…

RK3568平臺(音頻篇)audio_policy_volumes_drc.xml解析

audio_policy_volumes_drc.xml 是 Android 系統中用于配置音頻策略和音量的 XML 文件。它定義了音頻流的音量曲線、動態范圍控制(DRC)參數以及音頻設備的音量設置。該文件通常位于 /vendor/etc/ 或 /system/etc/ 目錄下,是 Android 音頻框架的重要組成部分。 以下是對 audi…

如何下載安裝 PyCharm?

李升偉 整理 一、下載 PyCharm 訪問官網 打開 PyCharm 官網&#xff0c;點擊 "Download" 按鈕25。 版本選擇&#xff1a; 社區版&#xff08;Community&#xff09;&#xff1a;免費使用&#xff0c;適合個人學習和基礎開發。 專業版&#xff08;Professional&#…

leetcode day27 455+376

455 分發餅干 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅干 j&#xff0c;都有…

HPC超算系列2——新手指南1

一&#xff0c;平臺簡介&#xff1a; 主要是官方手冊指南、B站視頻&#xff08;培訓視頻、軟件視頻&#xff09; 1&#xff0c;超算平臺架構&#xff1a; 和普通的家用電腦的架構不同&#xff0c; 主要區別在于&#xff1a;層次化的結構 &#xff08;1&#xff09;超算是有…

K8S單機部署

主線 :部署簡單的單節點k8s - sowler - 博客園 學習網址&#xff1a;為什么我不能獲取到鏡像&#xff0c;ImagePullBackoff | Kuboard docker鏡像源&#xff1a;https://chuxia.blog.csdn.net/article/details/145090710?spm1001.2101.3001.6650.3&utm_mediumdistribute…

web3區塊鏈

Web3 是指下一代互聯網&#xff0c;也被稱為“去中心化互聯網”或“區塊鏈互聯網”。它是基于區塊鏈技術構建的&#xff0c;旨在創建一個更加開放、透明和用戶主導的網絡生態系統。以下是關于 Web3 的一些關鍵點&#xff1a; ### 1. **核心概念** - **去中心化**&#xff1…