顺序栈和链栈的操作实现

目录

一. 前言

二.顺序栈

三. 链栈


一. 前言

        简而言之,顺序栈就是栈的顺序存储,链栈就是栈的链式存储。

二.顺序栈

        下面我们来看下顺序栈的结构定义

typedef char SElemType;
#define MAXSIZE 100
typedef struct{SElemType * base;  //栈底指针SElemType * top;  //栈顶指针int stacksize;   //栈可用的最大容量
}SqStack;

其中的SElemType就表示用户自己所定义的数据类型。 

因为栈都满足后进先出的特点,所以我们一般操作的都是我们的栈顶指针top。当我们的栈顶指针top==栈底指针base的时候,就表示这是个空栈。而当我们的top-base==stacksize的时候,就表示这个栈已经满了,就不能执行如入栈等操作了。

下面我们来看下顺序栈的初始化,如下所示:

int InitStack(SqStack &S){S.base=new SElemType[MAXSIZE];    //给栈底分配空间if(!S.base) return -1;S.top=S.base;                    //初始时,栈顶指针等于栈底指针S.stacksize=MAXSIZE;
}

判断顺序栈是否为空栈的算法如下:

int StackEmpty(SqStack S){if(S.top==S.base)return true;    //栈为空的时候,返回trueelse return false;
}

求顺序栈的长度算法如下:

int StackLength(SqStack S){return S.top-S.base;    //栈顶指针减去栈底指针就是元素个数
}

清空顺序栈的算法如下:

int ClearStack(SqStack S){if(S.base) S.top=S.base;    //栈为空的条件return 1;
}

销毁顺序栈的算法如下:

int DestroyStack(SqStack&S){if(S.base){delete S.base;S.stacksize=0;S.base=S.Top=NULL;}return 1;
}

 顺序栈的入栈:

int Push(SqStack&S,SElemType e){if(S.top-S.base==S.stacksize) return -1;    //栈满时,入不了栈*S.top++=e;return 1;
}

顺序栈的出栈:

int Pop(SqStack&S,SElemType &e){if(S.top==S.base)return -1;e=*--S.top;    //因为top指向有数据的上一位return 1;
}

三. 链栈

        链栈是一种特殊的单链表,只能在链表的头部进行操作。

下面我们来看下链栈的结构定义:

typedef struct StackNode{SELemType data;struct StackNode* next;
}StackNode,*LinkStack;

 链栈的特点如下所示:

下面我们来看下链栈的初始化:

void InitStack(LinkStack&S){S=NULL;return 1;
}

只需要让链栈指向空指针即可。 

 判断链栈是否为空:

int StackEmpty(LinkStack S){if(S==NULL) return true;else return false;
}

链栈的入栈:

int Push(LinkStack &S,SElemType e){StackNode* p=new StackNode;   //生成新结点p,并分配好空间p->data=e;        //将新结点的数据域置为ep->next=S;       //将新结点插入栈顶S=p;            //修改栈顶指针return 1;
}

链栈的出栈:

int Pop(LinkStack&S,SElemType &e){if(S=NULL) return -1;e=S->data;        //将栈顶的值取出StackNode* p=S;        //将此时的栈顶指针保存S=S->next;           //取出栈顶的指针后,栈顶的指针需要更改delete p;            //释放空间return 1;
}

取栈顶元素

SElemType GetTop(LinkStack S){if(S!=NULL)return S->data;
}

 以上便是我们顺序栈和链栈的所有操作算法。

        

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用git命令行的方式,将本地项目上传到远程仓库

在国内的开发环境中,git的使用是必不可少的。Git 是一款分布式版本控制系统,用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式,将本地项目上传到远程仓库,虽然现在的IDE中基本都配置了g…

SPI 通信协议

文章目录 一 简介二 特点三 接口四 时钟极性和时钟相位五 优缺点 一 简介 ​ SPI (Serial Perripheral Interface),是由 Motorola 公司推出的一种高速、全双工的总线协议。SPI 采用主从方式工作,一般由 SCLK、CS、MOSI、MISO 四根线组成,主机…

DNS劫持实验

实验背景 利用ettercap进行DNS欺骗,攻击者冒充域名服务器,也就是把查询的IP地址设为攻击者 的IP地址,这样用户上网就只能看到攻击者设计的网页。 实验设备 一个网络 net:cloud0 一台模拟黑客主机 kali 一台靶机 windows 主机 实验拓扑 …

机器学习之人脸识别-使用 scikit-learn 和人工神经网络进行高效人脸识别

文章摘要 本文将介绍如何使用 Python 的 scikit-learn 库和人工神经网络(ANN)来识别人脸。我们将使用 LFW 数据集(Labeled Faces in the Wild),这是一个广泛用于人脸识别基准测试的大型人脸数据库。我们将展示如何准备…

【微软蓝屏】构建更加稳固和安全的网络环境:从“微软蓝屏”事件谈起

最近,那个让全球都头疼的“微软蓝屏”事件,简直就像是科技界的一场大地震。你说这背后的原因,竟然是一个软件更新的小失误?哎呀,这可真是让人哭笑不得。不过,笑归笑,这事儿也给我们提了个醒&…

nodejs - express 学习笔记

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs. com.cn/ 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务&am…

TiDB-从0到1-sync-diff-inspector数据校验工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、sync-diff-inspector工具 sync-diff-inspector是TiDB原生…

3.仓颉编程_没有switch_case需使用match_case

仓颉编程_没有switch_case需使用match_case 支持两种 match 表达式,一种是包含待匹配值的 match 表达式,另一种是不含待匹配值的 match 表达式。 含有匹配值的 match 表达式 main() {let a Hello World!//不可变量var a2 var b 77 //可变变量match(b…

指针!!C语言(第三篇)

目录 一. 二维数组传参的本质 二. 函数指针变量和函数指针数组 三. typedef关键字 四. 转移表 五. 回调函数以及qsort使用举例 一. 二维数组传参的本质 🍟首先我们先回顾一下二维数组是怎样传参的?我们需要传入数组名以及行数和列数,这…

Dhtmlx Gantt教程:创建交互式甘特图的完整指南

在现代的项目管理中,时间是一种宝贵的资源,而甘特图则是一把解锁项目进度的魔法钥匙,想象一下,您可以在一个直观而动态的时间轴上,清晰地看到项目的每一个任务如何交织在一起,如何随着时间的推移展开&#…

LangChain4j-RAG高级-检索增强器

Retrieval Augmentor 检索增强器 RetrievalAugmentor 是 RAG 管道的入口点。它负责使用从各种来源检索的相关 Content 来扩充 ChatMessage 。 可以在创建 AiService 期间指定 RetrievalAugmentor 的实例: Assistant assistant AiServices.builder(Assistant.cla…

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向,近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力,为人类带来了诸多便利。大型语言模型的出现,使得…

初识git工具~~上传代码到gitee仓库的方法

目录 1.背景~~其安装 2.gitee介绍 2.1新建仓库 2.2进行相关配置 3.拉取仓库 4.服务器操作 4.1克隆操作 4.2查看本地仓库 4.3代码拖到本地仓库 4.4关于git三板斧介绍 4.4.1add操作 4.4.2commit操作 4.4.3push操作 5.一些其他说明 5.1.ignore说明 5.2git log命令 …

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点,以便实现前后端分离的技术栈,目前的进度已经大致完成,唯一的问题就是需要安装 JWT token 插件。 功能介绍: 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

【Node.js基础05】包的理解与使用

一:包的理解与简介 1 什么是包 包是一个将模块、代码、以及其他资料聚合成的文件夹 2 包的分类 项目包:编写项目代码的文件夹 软件包:封装工具和方法供开发者使用 3 为什么要在软件包中编写package.json文件 记录包的清单信息 二&…

Matlab arrayfun 与 bsxfun——提高编程效率的利器!

许多人知道 MATLAB 向量化编程,少用 for 循环 可以提高代码运行效率,但关于代码紧凑化编程, arrayfun 与 bsxfun 两个重要函数却鲜有人能够用好,今天针对这两个函数举例说明其威力。 Matlab arrayfun 概述 arrayfun 是 Matlab …

力扣SQL 最后一个能进入巴士的人 自连接

Problem: 1204. 最后一个能进入巴士的人 文章目录 思路复杂度Code 思路 👨‍🏫 参考题解 复杂度 时间复杂度: O ( ∗ ) O(*) O(∗)空间复杂度: O ( ∗ ) O(*) O(∗) Code select a.person_name from queue a,queue b where a.turn > b.turn -…

[极客大挑战 2019]PHP1

打开靶机 提示有备份,可以用工具扫描,我还没有配置好环境,搜了一下其他师傅的:备份的地址在这: /www.zip 下载后得到这几个文件: index.php就是上面打开的网页,其中有一段php代码:…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一,后端接口开发Controller层修改接口接口测试 二,前端开发 这一节的内容是开发获取分类属性分组的接口。 一,后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

ROS getting started

文章目录 前言一、认识ROS提供的命令行工具nodestopicsservicesparametersactionsrqt_console, rqt_graph批量启动多个节点recorde and playc基础pub-sub 1.5 ROS2和fastdds1 改变订阅模式2 xml配置3 指定xml位置4 talker/listener通过发现服务器发送topic5 ros2 检视6 远程fas…