棧(順序棧)實現Language C

###王道考研的學習領悟,個人喜好講解清晰

何為棧??

定義:棧(stack)是只允許在一端進行插入或刪除的線性表。

其重要術語:棧頂,棧底,空棧。

?我們只需要把這個圖看明白了,理解起來就很快。

在這次的棧實現中,我們會運用到類似順序表的定義法,舉個例子:

Elemtype *data; == Elemtype data[Maxsize];

在實際的代碼操作中,指針與數組其實是等效的,指針指向一塊申請的堆空間,而數組存在棧空間

所以,我們在對于順序棧的聲明時,可以看作是對順序表的一次結構體聲明。?

對于每個數據結構,我們都要反問自己三要素

數據結構順序表順序棧
邏輯結構結點相連,連續空間結點相連,連續空間
物理結構連續空間連續空間
數據的運算/基本操作可直接讀取所有元素只能快速讀取棧頂元素

?

所以我們開始吧。

棧的定義(Stack):

一.棧的定義&初始化

#include <stdio.h>#define MAXSIZE 10 //這里我就定義它有10個連續空間
typedef int Elemtype;typedef struct{Elemtype data[MAXSIZE]; //靜態數組存放棧的元素int top; //棧頂指針--->一直指向棧頂}SqStack;//聲明一個棧//初始化棧
bool InitStack(SqStack &s){s.top = -1; //將棧的指針設為空return true; 
}

補充一個小知識:如果我們使用---整型來定義數據結構的指針時,我們會使用 -1 來表示它此時指向為空,就相當于我們利用指針類型來定義的 中的NULL,空指針一樣。

-2可以表示為該空間暫時空閑。 其實我們也可將 s.top = 0; 這是另一種設法,后面的操作又會需要改變一些細節。這里我們用常用的設法來進行棧的操作定義吧。

二.判斷棧是否為空棧

//判斷是否為空棧, 只要指針指向的為 -1 初始定義時,就可以認為是空棧
bool IsEmpty{SqStack s)
{if (s.top == -1){return true; //此時棧頂指針指向空}else{return false;}}

三.棧的入棧(push)

//棧的入棧,這里我會告訴你兩種表示法,選擇你喜歡的哪一個//@操作1
bool Push1(SqStack &s,Elemtype e)
{if (s.top == MAXSIZE-1){return false; //判斷是否滿棧了}s.top = s.top + 1; //先把指針指向下一個棧頂s.data[top] = e; //再把目的數值賦給當前的棧頂return true;}//@操作二  ++a 的意思是,先進行a = a + 1的操作并把結果返回給操作中bool Push2(SqStack &s,Elemtype e)
{if (s.top == MAXSIZE-1){return false; //目的與操作一相同}s.data[++s.top] = e; //相當于把 操作1中的--- 1.指針加1 2.棧頂賦值 結合在一起寫return true;
}

入棧就是先把 棧頂指針加一位,指向沒有值的棧頂,再通過數組的快速尋值【address】-

--> s.data[top] = e ,將 元素e賦給當前的棧,便完成了入棧操作。

四.棧的出棧

//棧的出棧//也有兩個出棧寫法
bool Pop1(SqStack &s,Elemtype &e)
{    if (s.top == -1){return false; //如果為空棧的話}//這時先把棧頂的值先拿出來e = s.data[s.top];s.top = s.top - 1;return true;
}//出棧寫法二   a-- 先完成該操作后 然后再進行 減1
bool Pop1(SqStack &s,Elemtype &e)
{if (s.top == -1){return false; //如果為空的話}e = s.data[s.top--];return true;
}

五.讀取棧頂元素

//獲取棧頂元素  
bool GetElem(SqStack s,Elemtype &e)
{if (s.top == -1){return false; //若為空,返回錯}e = s.data[s.top];return true;
}

六.改變棧頂的值

//改變棧頂的值bool ChangeNode(SqStack &s,Elemtype e)
{if (s.top == -1){return false;}s.data[s.top] = e;return true;
}

七.讀取棧里的所有值

 //無返回值
void PrintAll(SqStack s)
{while( s.top != -1){printf("%d",s.data[s.top]);}}

以上就是基本的該棧的基本操作,感謝你的觀看。

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

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

相關文章

學校機房Dev c++解決中文亂碼問題

工具->編譯選項->勾選 編譯時加入以下命令 -fexec-charsetGBK -finput-charsetUTF-8 顯示中文&#xff1a;工具->編輯器選項->去掉第一個的勾勾。

vue+node對接支付寶沙箱

目錄 一、準備工作 二、后端node 1、添加支付寶配置文件 2、開始寫支付提交接口 3、前端部分&#xff08;點擊提交訂單&#xff09;3.1、寫axios請求 3.2、點擊提交訂單按鈕后發送網絡請求 3.3、付款成功跳轉的頁面的路徑是下面這樣的&#xff1a; 4、后端向支付寶發請求…

Github上最值得學習的10個Android開源項目,安卓面試題

1.Java語言進階與Android相關技術核 Android應用是由Java語言進行開發的&#xff0c;SDK也是由Java語言編寫&#xff0c;對于Android來說&#xff0c;只要SDK沒有用Kotlin重寫&#xff0c;那么Java語言是都需要學習的。而且Android APK的后臺服務器程序大概率是Java語言構建&a…

【計算機網絡】應用層自定義協議

自定義協議 一、為什么需要自定義協議&#xff1f;二、網絡版計算器1. 基本要求2. 序列化和反序列化3. 代碼實現&#xff08;1&#xff09;封裝 socket&#xff08;2&#xff09;定制協議和序列化反序列化&#xff08;3&#xff09;客戶端&#xff08;4&#xff09;計算器服務端…

Javaweb之SpringBootWeb案例之自動配置以及常見方案的詳細解析

3.2 自動配置 我們講解了SpringBoot當中起步依賴的原理&#xff0c;就是Maven的依賴傳遞。接下來我們解析下自動配置的原理&#xff0c;我們要分析自動配置的原理&#xff0c;首先要知道什么是自動配置。 3.2.1 概述 SpringBoot的自動配置就是當Spring容器啟動后&#xff0c…

OLLAMA 本地模型調用

Ollama 網址下載 再cmd&#xff0c;用 library 里面的庫 英文對話&#xff1a; Gemma is available in both 2b and 7b parameter sizes: ollama run gemma:2bollama run gemma:7b (default) 中文對話 ollama run qwen:0.5bollama run qwen:1.8b 用vscode而不是cmd調用 …

【論文筆記】An Effective Adversarial Attack on Person Re-Identification ...

原文標題&#xff08;文章標題處有字數限制&#xff09;&#xff1a; 《An Effective Adversarial Attack on Person Re-Identification in Video Surveillance via Dispersion Reduction》 Abstract 通過減少神經網絡內部特征圖的分散性攻擊reid模型。 erbloo/Dispersion_r…

強化學習嵌入Transformer(代碼實踐)

這里寫目錄標題 ChatGPT的答案GPT4.0 ChatGPT的答案 # 定義Transformer模塊 class Transformer(nn.Module):def __init__(self, input_dim, hidden_dim, num_heads, num_layers):super(Transformer, self).__init__()self.encoder_layer nn.TransformerEncoderLayer(d_modeli…

Vue3中組件通訊的方式

Vue3中組件通訊的方式 1 &#x1f916;GPT&#x1f916;: (答案有點問題混淆了vue2的內容) 父組件向子組件傳遞數據 props 子組件通過 props 屬性從父組件接收數據。emit事件子組件通過emit 事件 子組件通過 emit事件子組件通過emit 發射事件向父組件發送消息。provide / in…

Java SpringCloud gateway面試題

Java SpringCloud gateway面試題 前言1、什么是網關Zuul&#xff08;gateway&#xff09;&#xff1f;2、服務網關的作用&#xff1f;3、Zuul網關(Gateway)如何搭建集群&#xff1f;4、ZuulFilter常用有那些方法&#xff1f;5、如何實現動態zuul網關路由轉發&#xff1f;6、在Z…

kubeadm安裝部署

目錄 1.要求 2.環境準備 3.所有節點安裝docker 4.所有節點安裝kubeadm&#xff0c;kubelet和kubectl 5.部署K8S集群 6.測試 7.擴展3個副本 8.部署Dashboard master&#xff08;2C/4G&#xff0c;cpu核心數要求大于2&#xff09;192.168.27.10docker、kubeadm、kubelet、…

LightDB - ecpg 支持dml 中使用 return into 【24.1】

在之前的版本中ecpg 中只能使用returning into 來給c 變量賦值&#xff0c;如下&#xff1a; exec sql update t1 set c aa where id 2 returning c into :c_val;為了兼容oracle pro*c 中return into 的用法&#xff0c;從24.1 開始&#xff0c; LightDB 也支持通過return in…

Chrome插件 | WEB 網頁數據采集和爬蟲程序

無邊無形的互聯網遍地是數據&#xff0c;品類豐富、格式繁多&#xff0c;包羅萬象。數據采集&#xff0c;或說抓取&#xff0c;就是把分散各處的內容&#xff0c;通過各種方式匯聚一堂&#xff0c;是個有講究要思考的體力活。君子愛數&#xff0c;取之有道&#xff0c;得注意遵…

mobile app 安全掃描工具MobSF了解下

可以干啥&#xff1a; static 靜態分析 dynamic 動態分析 可以用來滲透了 如何docker安裝 docker image 下載地址https://hub.docker.com/r/opensecurity/mobile-security-framework-mobsf/ setup 兩行即可 1 docker pull opensecurity/mobile-security-framework-mobsf…

關于VScode遠程編寫linux SHELL的報錯處理

使用vscode遠程編寫linux保存shell時&#xff0c;提示報錯&#xff1a; 未能保存“shell”: 無法寫入文件"vscode-remote:.../tmp/shell"(NoPermissions (FileSystemError): Error: EACCES: permission denied, open /tmp/shell) 大體意思是說&#xff1a;權限被拒…

Python | 從子目錄文件導入父目錄模塊的方法

問題描述 我有兩級目錄&#xff0c;第一級稱為parent_dir&#xff0c;第二級稱為child_dir。現在在child_dir下&#xff0c;有一個py&#xff0c;稱為child.py&#xff0c;在parent_dir下&#xff0c;也有一個py&#xff0c;稱為parent.py。 我想從child.py中導入parent.py中…

Go Slice的底層實現原理深度解析

文章目錄 切片的誕生&#xff1a;數組的延伸切片的結構初始化切片 切片的內存管理擴容機制 實例分析&#xff1a;切片的動態特性切片與性能性能對比 切片的并發安全并發場景下的切片操作 切片與接口切片與空接口 切片的遍歷與操作遍歷切片切片的切片操作 切片的垃圾回收切片的生…

年輕人怎么搞錢?

年輕人想要搞錢&#xff0c;可以考慮以下幾個方面&#xff1a; 1. 創業&#xff1a;年輕人可以通過自己的創意&#xff0c;找到一個市場的空缺&#xff0c;開創自己的業務。可以從比較小的項目開始&#xff0c;逐漸擴大范圍&#xff0c;積累經驗和財富。 2. 投資&#xff1a;…

成為大佬之路--linux軟件安裝使用第000000021篇--linux安裝docker

簡介 Docker 是一個開源項目&#xff0c;誕生于 2013 年初&#xff0c;最初是 dotCloud 公司內部的一個業余項目。它基于 Google 公司推出的 Go 語言實現。 項目后來加入了 Linux 基金會&#xff0c;遵從了 Apache 2.0 協議&#xff0c;項目代碼在 [GitHub](https://github.co…

Hadoop之HDFS——【模塊二】數據管理

一、Namespace的概述 1.1.集群與命名空間的關系 類似于大集群與小集群之間的關系,彼此之間獨立又相互依存。每個namespace彼此獨立,Namespace工作時只負責維護本區域的數據,同時所有的namespace維護的文件都可以共用DataNode節點,為了區分數據屬于哪些Namespace,DataNode…