棧(基于動態順序表實現的棧)

棧的簡單介紹

關于棧的性質咳咳

棧:棧是一種特殊的線性表,其中只讓在一端插入和刪除元素。

后進先出

進行插入刪除的那一端叫棧頂,另一端叫棧底

我們實現的棧是基于一個動態順序表的的棧,會實現棧的? ?入棧,出棧,獲取棧頂元素,獲取棧中元素個數,判斷棧是否為空(純c語言版本)

操作的命名如下

棧的信息

這是棧的信息,

接下來初始化

我們在創建好棧的信息后定義一個棧,然后進行初始化,初始時我們可以讓棧中放4個元素,在開一段可以放入4個元素的內存,讓a指向

初始化

初始化要用到的函數malloc,這個不懂的可以看這個

動態內存管理()-CSDN博客

在我們開空間的化可能會開失敗,如果開失敗的化,直接把返回的指針給ps->a程序會出現內存問題,所以我們創建一個臨時變量,存放新開空間首位置的指針,如果這個指針不為空,就把臨時的tmp指針給ps->a。這個操作在后續操作用到,比如在入棧時棧滿,我們還要進行一次擴容,所以我們可以寫一個擴容函數

入棧

代碼如下

判空

判空這個操作實現的功能是如果這個棧里面沒有元素的化返回假,有元素返回真

在? Stack.h 中加入#include<stdbool.h>? ?就可以用布爾類型了,我們的棧中的top

真好就是棧中元素的真是個數-1,因為top,從0開始就有元素了,所以返回 top+1;即可

代碼如下

出棧

我們判空操作實現后就方便出棧了

在出棧時需要考慮一個棧是否為空的情況所以直接調用上面的函數特判一下,不為空讓top--,就可以了

代碼

獲取棧頂元素

判斷一下不是空,然后返回棧中top指向的元素,代碼如下

woc,怎末感覺突然沒話講了,

獲取棧中元素個數,棧的銷毀

完整的代碼


//Stack.h#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdbool.h>
#include<assert.h>
#include<windows.h>//棧的元素類型
typedef int STaType;typedef struct Stack
{STaType* a;int top;//棧頂int capacity;//棧滿容量
}Stack;//棧的打印
void Stack_print(Stack p);
//棧中元素的輸入
void Stack_scan(STaType* x);
//擴容
void Stack_Check();
//初始化
void Stack_Lnit(Stack* ps);
//入棧,出棧
void Stack_push(Stack* ps, STaType x);
void Stack_pop(Stack* ps);
//獲取棧頂元素
STaType Stack_top(Stack* ps);
//獲取棧內元素個數
int Stack_size(Stack* ps);
//判空
bool Stack_empty(Stack* ps);
//銷毀
void Stack_Destroy(Stack* ps);

//Stack.c#include"Stack.h"//typedef struct Stack
//{
//	STaType* a;
//	int top;//棧頂
//	int capacity;//棧滿容量
//}Stack;//棧的打印
void Stack_print(Stack p)
{printf("\n現在棧如下\n");while (p.top != -1){printf("%d\n", p.a[p.top]);p.top--;}printf("\n");printf("\n");
}//棧中元素的輸入
void Stack_scan(STaType* x)
{scanf("%d", x);
}//擴容
void Stack_Check(Stack*ps)
{assert(ps);int x = ps->capacity==0?4:ps->capacity*2;if (ps->top == ps->capacity){STaType* tmp = (STaType*)malloc(sizeof(STaType)*x);assert(tmp);ps->a = tmp;}ps->capacity = x;
}//初始化
void Stack_Lnit(Stack* ps)
{assert(ps);ps->capacity = 4;ps->top = -1;//棧頂有元素STaType *tmp= (STaType*)malloc(sizeof(STaType)*ps->capacity);if (tmp != NULL)ps->a = tmp;
}//入棧,出棧
void Stack_push(Stack* ps, STaType x)
{assert(ps);Stack_Check(ps);//判斷擴容ps->a[++ps->top] = x;
}void Stack_pop(Stack* ps)
{assert(ps);if(!Stack_empty(ps))ps->top--;else{printf("棧為空,出棧失敗\n");return;}
}//獲取棧頂元素
STaType Stack_top(Stack* ps)
{assert(ps);if (Stack_empty(ps)){printf("棧為空,出棧失敗\n");return 0;}return ps->a[ps->top];
}//獲取棧內元素個數
int Stack_size(Stack* ps)
{assert(ps);return ps->top + 1;
}//判空
bool Stack_empty(Stack* ps)
{//為空返回真,不為空返回假assert(ps);return ps->top == -1;
}//銷毀
void Stack_Destroy(Stack* ps)
{if (ps->a){free(ps->a);}ps->a = NULL;ps->top = ps->capacity = 0;
}

//Text.c#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"void enumm()
{printf("********************************************************************\n");printf("********************************************************************\n");printf("********************************************************************\n");printf("********************************************************************\n");printf("**1  初始化                           2.入棧                                 **************\n");printf("**3  出棧                           4.獲取棧頂元素                   **************\n");printf("**5  獲取棧中元素個數       6判空                                 **************\n");printf("**7  銷毀棧                        0退出                                 **************\n");printf("********************************************************************\n");printf("*******************************************************************\n");printf("********************************************************************\n");
}void text()
{Stack pp;enumm();do{int po; scanf("%d", &po);switch (po){case 1://創Stack_Lnit(&pp);break;case 2://入棧STaType x;Stack_scan(&x);Stack_push(&pp, x);Stack_print(pp);break;case 3://出棧Stack_pop(&pp);Stack_print(pp);break;case 4://獲取棧頂元素STaType xx= Stack_top(&pp);printf("%d", xx);break;case 5://獲取棧中元素個數int n = Stack_size(&pp);printf("%d", n);break;case 6://判空if (!Stack_empty(&pp)) printf("不是空\n");else printf("是空\n");break;case 7://銷毀棧Stack_Destroy(&pp);case 0://退出goto xxx;break;}//system("cls");} while (1);
xxx:;}signed main()
{text();getchar();return 0;
}

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

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

相關文章

修改默認時區,默認語言,默認國家

確認時區&#xff0c;語言&#xff0c;國家 build/make/target/product/languages_default.mkframeworks/base/packages/SettingsLib/res/xml/timezones.xml設備mk中添加相關內容 PRODUCT_PROPERTY_OVERRIDES \persist.sys.timezoneEurope/AmsterdamPRODUCT_PROPERTY_OVERRI…

嵌入式學習——3——超時timeout

1、自帶超時參數的函數 select自帶超時 定義超時時間變量 struct timeval tv {5, 0}; while(1) { tv.tv_sec 5; tv.tv_usec 0; int res select(1, &readfds, NULL, NULL, &tv); ..... } poll自帶超時 1、poll函數的第三個參數&#xff0c;是以毫秒為單位的超時時間…

前端vue用el-table如何實現表頭內容過長換行處理,實現換行效果

前端vue用el-table如何實現表頭內容過長換行處理&#xff0c;實現換行效果 這是效果圖 有兩種方法&#xff0c;一種簡易版本&#xff0c;一種萬能方法,都是el-table&#xff0c;先看文檔 表頭標題是可以自定義的 方法一 label的解釋寫在代碼里面了&#xff0c;這里會自動形成換…

Python概述

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 了解Python Python&#xff0c;本義是指“蟒蛇”。1989年&#xff0c;荷蘭人Guido van Rossum發明了一種面向對象的解釋型高級編程語言&#xff0c;…

利用神經網絡學習語言(六)——總結與常見面試問題

相關說明 這篇文章的大部分內容參考自我的新書《解構大語言模型&#xff1a;從線性回歸到通用人工智能》&#xff0c;歡迎有興趣的讀者多多支持。 文章列表&#xff1a; 利用神經網絡學習語言&#xff08;一&#xff09;——自然語言處理的基本要素利用神經網絡學習語言&…

Java基礎入門day49

day49 tomcat 啟動 進入tomcat的bin目錄&#xff0c;雙擊或者運行startup.bat文件啟動tomcat 控制臺最后出現服務器啟動在多少毫米之內&#xff0c;代表服務器成功啟動 org.apache.catalina.startup.Catalina.start Server startup in 405 ms 驗證tomcat 在瀏覽器中輸入 loca…

一次性計時器

Name: 一次性計時器 Copyright:No Author: 袁神派蒙 Date: 22/05/24 20:40 Description: 一次性的計時器&#xff08;by 袁神派蒙&#xff09; 直接上代碼&#xff1a; /*Name: 一次性計時器 Copyright:No Author: 袁神派蒙Date: 22/05/24 20:40Description: 一次性的計時器…

[算法] 優先算法(二): 雙指針算法(下)

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄:&#x1f355; Collection與數據結構 (91平均質量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

基于transformers框架實踐Bert系列6-完形填空

本系列用于Bert模型實踐實際場景&#xff0c;分別包括分類器、命名實體識別、選擇題、文本摘要等等。&#xff08;關于Bert的結構和詳細這里就不做講解&#xff0c;但了解Bert的基本結構是做實踐的基礎&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

自己動手寫docker——Namespace

Linux Namespace linux Namespace用于隔離一系列的系統資源&#xff0c;例如pid&#xff0c;userid&#xff0c;netword等&#xff0c;借助于Linux Namespace&#xff0c;可以實現容器的基本隔離。 Namespce介紹 Namespace類型系統調用參數作用Mount NamespaceCLONE_NEWNS隔離…

Python筑基之旅-MySQL數據庫(一)

目錄 一、MySQL數據庫 1、簡介 2、優點 2-1、開源和免費 2-2、高性能 2-3、可擴展性 2-4、易用性 2-5、靈活性 2-6、安全性和穩定性 2-7、豐富的功能 2-8、結合其他工具和服務 2-9、良好的兼容性和移植性 3、缺點 3-1、對大數據的支持有限 3-2、缺乏全文…

微服務如何做好監控

大家好&#xff0c;我是蒼何。 在脈脈上看到這條帖子&#xff0c;說阿里 P8 因為上面 P9 斗爭失敗走人&#xff0c;以超齡 35 被裁&#xff0c;Boss 上找工作半年&#xff0c;到現在還處于失業中。 看了下溝通記錄&#xff0c; 溝通了 1000 多次&#xff0c;但沒有一個邀請投遞…

uniapp中使用 iconfont字體

下載 iconfont 字體文件 打開 iconfont.css 文件&#xff0c;修改一下 把文件 復制到 static/iconfont/… 目錄下 在App.vue中引入iconfont 5. 使用iconfont 使用 iconfont 有兩種方式&#xff0c; 一種是 class 方式&#xff0c; 一種是使用 unicode 的方式 5.1 使用 class 的…

【Mac】Dreamweaver 2021 for mac v21.3 Rid中文版安裝教程

軟件介紹 Dreamweaver是Adobe公司開發的一款專業網頁設計與前端開發軟件。它集成了所見即所得&#xff08;WYSIWYG&#xff09;編輯器和代碼編輯器&#xff0c;可以幫助開發者快速創建和編輯網頁。Dreamweaver提供了豐富的功能和工具&#xff0c;包括代碼提示、語法高亮、代碼…

51單片機學習(1)2-1點亮一個LED

#include <REGX52.H> void() { p20xFE;//1111 1110 while(1) { //讓程序停了下來了。 } }

教你一分鐘搭建適合IT人員的在線開發工具箱

文章目錄 1. 使用Docker本地部署it-tools2. 本地訪問it-tools3. 安裝cpolar內網穿透4. 固定it-tools公網地址 本篇文章將介紹如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同樣可以結合cpolar實現公網訪問。 在前一篇文章中我們講解了如何在Linux中使用Docker搭…

Anaconda Jupyter 報錯及解決方法記錄

一、AttributeError: module lib has no attribute X509_V_FLAG_CB_ISSUER_CHECK 背景&#xff1a;Anaconda更新版本后&#xff0c;運行import oss2時報錯 ~/anaconda3/lib/python3.8/site-packages/OpenSSL/crypto.py in X509StoreFlags() 1535 NOTIFY_POLICY _lib…

【Java基礎】集合(1) —— Collection

存儲不同類型的對象: Object[] arrnew object[5];數組的長度是固定的, 添加或刪除數據比較耗時 集合: Object[] toArray可以存儲不同類型的對象隨著存儲的對象的增加&#xff0c;會自動的擴容集合提供了非常豐富的方法&#xff0c;便于操縱集合相當于容器&#xff0c;可以存儲多…

探索Git之旅:倉庫代碼版本控制藝術

探索Git之旅&#xff1a;倉庫代碼版本控制藝術 引言Git基礎與核心概念什么是版本控制&#xff1f;Git的工作流程分布式特性 Git實戰操作指南安裝與配置克隆倉庫日常操作分支管理解決沖突 高級技巧與最佳實踐Git FlowGit鉤子Git別名 安全與性能考量結語與引發討論 引言 在軟件開…

馮喜運:5.16黃金是否突破阻力?黃金原油趨勢分析

【黃金消息面分析】&#xff1a;周四(5月16日)亞市盤中&#xff0c;現貨黃金延續昨日升勢&#xff0c;金價目前最高觸及2397.44美元/盎司&#xff0c;為4月19日以來新高。FXStreet首席分析師Valeria Bednarik撰文&#xff0c;對黃金技術前景進行分析。Bednarik指出&#xff0c;…