栈(基于动态顺序表实现的栈)

栈的简单介绍

关于栈的性质咳咳

栈:栈是一种特殊的线性表,其中只让在一端插入和删除元素。

后进先出

进行插入删除的那一端叫栈顶,另一端叫栈底

我们实现的栈是基于一个动态顺序表的的栈,会实现栈的   入栈,出栈,获取栈顶元素,获取栈中元素个数,判断栈是否为空(纯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.mzph.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…

前端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…

[算法] 优先算法(二): 双指针算法(下)

&#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…

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;包括代码提示、语法高亮、代码…

教你一分钟搭建适合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;可以存储多…

冯喜运:5.16黄金是否突破阻力?黄金原油趋势分析

【黄金消息面分析】&#xff1a;周四(5月16日)亚市盘中&#xff0c;现货黄金延续昨日升势&#xff0c;金价目前最高触及2397.44美元/盎司&#xff0c;为4月19日以来新高。FXStreet首席分析师Valeria Bednarik撰文&#xff0c;对黄金技术前景进行分析。Bednarik指出&#xff0c;…

「51媒体」北京财经媒体有哪些?媒体邀约宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 北京作为中国的首都&#xff0c;拥有众多的财经媒体&#xff0c;这些媒体在财经新闻报道、经济分析、市场研究等方面发挥着重要作用。根据搜索结果&#xff0c;以下是一些北京地区的财经…

CV每日论文--2024.5.15

1、Can Better Text Semantics in Prompt Tuning Improve VLM Generalization? 中文标题&#xff1a;更好的文本语义在提示微调中能否提高视觉语言模型的泛化能力? 简介&#xff1a;这篇论文介绍了一种新的可学习提示调整方法,该方法超越了仅对视觉语言模型进行微调的传统方…

Lazyboy品牌发布会“球幕气膜”

Lazyboy品牌发布会“球幕气膜”为品牌活动提供了一个独特、现代化、环保的展示空间。这座球幕气膜不仅为发布会提供了一个视觉震撼的场地&#xff0c;也为与会嘉宾带来了全新的体验。作为轻空间&#xff08;江苏&#xff09;膜科技有限公司&#xff08;以下简称“轻空间”&…

使用Docker在阿里云ECS上部署Gitlab,提供代码托管、CICD 和 docker镜像服务

文章目录 使用Docker在阿里云ECS上部署Gitlab1.购买一个数据&#xff0c;挂载到/data用于存储gitlab相关数据2. 部署docker引擎3. 调整ssh的默认端口&#xff0c;将22端口留给gitlab4. 部署gitlab5. 进入docker容器获取gitlab的默认密码6. 登录gitlab&#xff0c;完成gitlab-ru…

linux ndk编译搭建测试

一、ndk下载 NDK 下载 | Android NDK | Android Developers 二、ndk环境变量配置 ndk解压&#xff1a; unzip android-ndk-r26d-linux.zip 环境变量配置&#xff1a; export NDK_HOME/rd/own/test/android-ndk-r26d/ export PATH$PATH:$NDK_HOME 三、编译测试验证 …