栈(顺序栈)实现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://xiahunao.cn/news/2821907.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章&#xff1a; 封装窗口工具类【1】雏形 我们思考一下窗口间的关系&#xff0c;窗口创建和销毁的一些动作&#xff0c;例如父子窗口&#xff0c;窗口组合等等&#xff0c;还有…

Prometheus(二):NodeExporter和Grafana的安装和使用

目录 1 Node Exporter安装1.1 简介1.2 安装1.3 Prometheus收集node_exporter数据 2 安装Grafana2.1 安装2.2 使用1、创建数据源2、选择模板3、模板导入 2.3 grafana创建用户1、创建用户2、验证 总结 1 Node Exporter安装 1.1 简介 node exporter是Prometheus的收集数据的组件…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

【计算机网络】五种IO模型与IO多路转接之select

文章目录 一、五种IO模型二、非阻塞IO1.fcntl2.实现函数SetNoBlock3.轮询方式读取标准输入 三、I/O多路转接之select1.初识select2.select函数原型3.socket就绪条件4.select的特点5.select缺点6.select使用案例--只读取数据的server服务器1.err.hpp2.log.hpp3.sock.hpp4.select…

面试题JS篇

目录 Js 基本数据类型有哪些Ajax 如何使用如何判断一个数据是 NaN&#xff1f;Js 中 null 与 undefined 区别闭包是什么&#xff1f;有什么特性&#xff1f;对页面会有什么影响JS中模块化的方法Js 中常见的内存泄漏什么是事件冒泡&#xff1f;如何阻止事件冒泡&#xff1f;事件…

windows server mysql 数据库停止 备份 恢复全流程操作方法

一,mysql备份 mysql最好是原工程文件备份.不需要sql查询的方式备份.安全高效. 比如,安装php与mysql组合后,我的mysql文件保存在: D:\phpstudy_pro\Extensions\MySQL5.7.26\data\dux 我只需要复制一份,保存起来就行. 二,mysql恢复 怎么恢复呢.我们一般是只恢复其中一个表,则找…

初学者如何使用QT新建一个包含UI界面的C++项目

文章目录 一、下载并安装QT51、下载安装包2、注册/登录账号3、安装qt6 二、新建QT Widget项目1、新建项目并且运行2、易错点&#xff1a;可能运行成功得到UI界面但是会报错&#xff08;原因是使用了中文路径&#xff09; 一、下载并安装QT5 1、下载安装包 进入下载网址 Windo…

MES系统在离散制造企业中的功能解析

随着信息技术的快速发展和制造业的转型升级&#xff0c;MES在离散制造企业中的作用日益凸显。MES系统不仅提高了生产效率和产品质量&#xff0c;还优化了资源配置&#xff0c;增强了企业的市场竞争力。 一、生产管理功能 MES系统能够实时监控生产现场的各种数据&#xff0c;包…

java小记(2)

IS-A&#xff1a;类的父子继承关系。 default&#xff1a;关键字&#xff0c;与Java中的public&#xff0c;private等关键字一样&#xff0c;都属于修饰符关键字&#xff0c;可以用来修饰属性、方法以及类&#xff0c;但是default一般用来修饰接口中的方法。 接口与抽象类的区…

WSL2部署RV1126 SDK编译环境

1 下载RV1126 SDK 在 Firefly | 让科技更简单&#xff0c;让生活更智能 下载REPO_SDK 这里将SDK下载到了F:\SDK 2 解压SDK到WSL2 tar -xvf /mnt/f/SDK/rv1126_rv1109_linux_release_20211022.tgz 3 编译依赖安装 gcc、g版本依赖安装 sudo apt-get install lib32gcc-7-dev g-7 l…

普通索引和唯一索引详解

前言 面试的时候有时会问面试者&#xff0c;普通索引和唯一索引有什么区别。很多人&#xff0c;甚至工作很多年的工程师回答的千篇一律 “普通索引可以有重复的值&#xff0c;唯一索引不能有重复的值”。于是我又问&#xff0c;这两个索引这两个索引效率哪个高&#xff0c;很少…

ant design pro的react项目build之后页面为空白解决方法

一、问题 执行yarn build之后访问dist文件夹中的index.html文件为空白 二、解决方法 找到config文件夹中的config.ts文件 添加代码 history: {type: hash }, publicPath: ./,修改完重新build一下就好了

BY组态功能清单

演示地址 &#xff1a;http://www.byzt.net:60/sm/ 官网地址&#xff1a;http://www.hcy-soft.com BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架…

你真的了解C语言中的【柔性数组】吗~

柔性数组 1. 什么是柔性数组2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的优势 1. 什么是柔性数组 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它确实是存在的。 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员…

Spring Boot整合Kafka

文章目录 1. 介绍2. Kafka基础2.1. 安装KafKakafka集群搭建_kafka交流群-CSDN博客 3. Spring Boot整合Kafka3.1. 引入Kafka依赖3.2.编写配置文件 4. 生产者&#xff08;produced&#xff09;4.1. 生产者基础案例(基础测试) 5. 消费者5.1.消费者基本案例(基础测试) 6.Kafka常用配…

python 公共函数及操作符使用示例合集

python公共操作符以及方法是什么 在Python中&#xff0c;公共操作通常指的是那些可以对不同数据类型&#xff08;如数字、字符串、列表、元组、字典等&#xff09;进行操作的通用函数或方法。这些操作符或函数通常是内置的&#xff0c;并且可以在Python的官方文档中找到。 主要…

数字电路 第五章—第四节(顺序脉冲发生器)

一、计数型顺序脉冲发生器 1、电路组成 计数型顺序脉冲发生器一般都是按自然态序计数的二进制计数器和译码器组成。 2、输出4个脉冲的顺序脉冲发生器 &#xff08;1&#xff09;逻辑电路图&#xff08;采用JK触发器&#xff09;&#xff1a; &#xff08;2&#xff09;时序图…

二叉搜索树的范围和(Lc938)——DFS

给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示例 2&#xff1a; 输入&#xff1a;root [10,5,15,3,7,13,18,1,nul…

家居清洁必备:2024如何挑选高效家用洗地机的实用指南

对于养宠物的家庭来说&#xff0c;宠物的毛发无处不在&#xff0c;尤其在换毛季节&#xff0c;清理工作更加繁琐。此时&#xff0c;洗地机的出现为解决这些问题提供了便利。洗地机可以同时扫地和拖地&#xff0c;实现高效清洁&#xff0c;减轻了清洁负担。而且&#xff0c;洗地…

【爬虫逆向实战 逆向滑块 Python+Node】今天逆向的网站有点嘿嘿,还是仅供学习,别瞎搞

逆向日期&#xff1a;2024.03.01 使用工具&#xff1a;Node.js、Python 加密方法&#xff1a;AES标准算法 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算…