栈(顺序栈)实现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.mzph.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…