栈————顺序栈和链式栈

news2024/10/6 10:34:45

目录

顺序栈

1、初始化顺序栈 

2、判栈空

3、进栈

4、出栈

5、读栈顶元素

6、遍历

链式栈

1、初始化链式栈

2、断链式栈是否为空判

3、入栈(插入)

​编辑​编辑

4、出栈(删除)

5、读取栈顶元素

6、输出链式栈中各个节点的值(遍历)


作为一种数据结构,是一种只能在同一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,最先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)也就是后进先出(LIFO)或者先进后出(FILO)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

1.什么是栈,我们引用图例来帮助理解:

顺序栈

1、初始化顺序栈 
SqStack *initStack(){
	SqStack *s; 
	s = (SqStack*)malloc(sizeof(SqStack)); //划分内存空间
	if(!s){//判断内存空间的划分是否成功
        printf("空间不足\n");
        return NULL;
    }else{
        s->top = -1;//栈空以-1标记
        return s;  //返回栈
    }
}
2、判栈空
//判栈空
int stackEmpty(SqStack *s){	
	if(s->top==-1){         
		return 1;       
	}else{
		return 0;      
	}
}
3、进栈
//进栈 
int push(SqStack *s,datatype x){//入栈操作,s代表栈,x代表我们入栈的值 
	if(s->top==MAXSIZE-1)
    {
		printf("\nThe squence stack is full!");
		return 0;
	}else{
		s->data[++s->top]=x;//指针先加一,在入栈 
		return 1; 
	}		    
} 
4、出栈
//出栈 
int pop(SqStack *s,datatype *x){//出栈操作,s代表栈,指针x代表输出的值,指针实参为地址
	if(stackEmpty(s))          //栈空,报错 
	{
		printf("\nThe squence stack is empty!");
		return 0;
	}else{
	    *x=s->data[s->top--];//先出栈,指针在减一 
	    return 1;
	}	    
} 
5、读栈顶元素
//读栈顶元素 
int getTop(SqStack *s){
	if(stackEmpty(s))          //栈空,报错 
	{
	    printf("\n栈是空的!");
		exit(1);
	}else{
		return s->data[s->top];
	} 
}
6、遍历
//遍历 
int display(SqStack *s){
    int i;
    printf("当前栈中的元素:\n");
    for(i = s->top; i >= 0; i--)
        printf("%3d", s->data[i]);
    printf("\n");
    return 0;
}

链式栈

链式栈是一种数据存储结构,可以通过单链表的方式来实现。

优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,且除了存放每个栈元素的数据域,还需要额外分配指针空间用来存放指针的指针域。也就是有一个栈顶指针,指向了一个单链表,单链表存数据,栈顶指针取,放数据。

什么是链式栈?

链式栈,其实和单链表很相似,进栈可以理解为单链表的头插法,出栈可以理解为带头结点的单链表输出,只不过它的头结点就是我们的栈顶,栈顶用来输入和输出。

1、初始化链式栈
//初始化链式栈
int initStack() {
    return  NULL;
}
2、断链式栈是否为空判
//判断链式栈是否为空
int isEmpty(LinkStack *top) {
    return (top?0:1); //栈空返回 1
}
3、入栈(插入)
//入栈(插入)
LinkStack *push(LinkStack *top,datatype x){
    LinkStack *p;
	p = (LinkStack*)malloc(sizeof(LinkStack));//分配空间
    p->data = x;      //设置新结点的值
    p->next = top;   //将新元素插入栈中
    top = p;          //将新元素设为栈顶
    return top;
}
4、出栈(删除)
//出栈(删除)
LinkStack *pop(LinkStack *top,datatype *x) {
	LinkStack *q;
    if(!top){printf("栈为空,无法出栈!\n");return NULL;}
    q = top;         //指向被删除的栈顶  
    *x=q->data;      //返回我们出栈的值 
    top = top->next;   //修改栈顶指针
    free(q);         //释放已经出栈的结点
    return top;
}
5、读取栈顶元素
//读取栈顶元素
int getTop(LinkStack *top) {
    if (!top) {
        printf("栈为空,无法读取栈顶元素!\n");
        return 0;
    }
    return top->data;//返回栈顶的值
}
6、输出链式栈中各个节点的值(遍历)
//输出链式栈中各个节点的值
void display(LinkStack *top) {
    LinkStack *p = top;
    if (!p) {printf("栈为空,无法读取栈顶元素!\n");}
    while (p) {
        printf("%3d ", p->data);
        p = p->next;
    }
    printf("\n");
}

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

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

相关文章

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】 题目描述:解题思路一:从左下角或者右上角元素出发,来寻找target。解题思路二:右上角元素,代码解题思路三:暴力也能过解题思路四:二分…

【小呆的力学笔记】弹塑性力学的初步认知六:后继屈服条件

文章目录 4. 后继屈服条件4.1 后继屈服条件4.2 强化模型4.2.1 等向强化模型4.2.2 随动强化模型4.2.3 两种强化模型的讨论 4. 后继屈服条件 4.1 后继屈服条件 上一章节的屈服条件是在当材料未经受任何塑性变形时且在载荷作用下材料第一次进入屈服应该满足的条件(也…

Vscode + PlatformIO + Arduino 搭建EPS32开发环境

Vscode PlatformIO Arduino 搭建EPS32开发环境 文章目录 Vscode PlatformIO Arduino 搭建EPS32开发环境1. Vscode插件安装2. 使用PlatformIO新建工程3.工程文件的基本结构4.一个基本的测试用例Reference 1. Vscode插件安装 如何下载vscode这里不再赘述,完成基本…

LeetCode-热题100:160. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…

异常,Lambda表达式

文章目录 异常介绍存在形式程序中异常发生后的第一反应体系JVM的默认处理方案处理方式声明 throws概述格式抛出 throw格式注意意义 throws和throw的区别 捕获 try,catch介绍格式执行方式多异常捕获处理意义 如何选择用哪个 Throwable类介绍常用方法 自定义异常概述实现步骤范例…

2_3.Linux系统中的日志管理

# 1.journald # 服务名称:systemd-journald.service journalctl 默认日志存放路径: /run/log (1) journalctl命令的用法 journalctl -n 3 ##日志的最新3条--since "2020-05-01 11:00:00" ##显示11:00后的日…

Mysql的高级语句3

目录 一、子查询 注意:子语句可以与主语句所查询的表相同,但是也可以是不同表。 1、select in 1.1 相同表查询 1.2 多表查询 2、not in 取反,就是将子查询结果,进行取反处理 3、insert into in 4、update…

LeetCode226:反转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 解题思想 使用前序遍历和后序遍历比较方便 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) return root;swap(root->left, root…

vue 文件下载

1.返回路径下载 注: 针对一些浏览器无法识别的文件格式(如pdf、xls、ppt)。可以直接在地址栏上输入URL即可触发浏览器的下载功能。 情况1 //地址栏输入文件URLwindow.location.href URLwindow.open(URL) 注:该方式将下载逻辑放在后端处理&#xff0c…

Learning Discriminative Representations for Skeleton Based Action Recognition

标题:基于骨架的动作识别的学习判别性表示 原文链接:Learning Discriminative Representations for Skeleton Based Action Recognition (thecvf.com) 源码链接:https://github.com/zhysora/FR-Head 发表:CVPR 摘要 最近&…

后端返还二进制excl表格数据时候,如何实现在前端下载表格功能及出现表格打开失败的异常处理。

背景: 后端返还一个二进制流的excl表格数据,前端需要对其解析,然后可提供给客户进行下载。 思路:把二进制流数据转换给blob对象,然后利用a标签进行前端下载。 代码: 后端返还 类似如下的数据 前端代码…

OpenHarmony实战:Hilog组件在交互时应用指南

一、OpenHarmony hilog 组件工具概述 hilog 是 OpenHarmony 日志系统,提供给系统框架、服务、以及应用打印日志,记录用户操作、系统运行状态等。适用于 OpenHarmony 应用、硬件开发及测试人员,是每个开发人员的必备、入门工具。 hilog 日志查看命令行工…

3.28号系统移植

系统移植就是给开发板搭建一个linux操作系统 1. 安装tftp服务器 tftp服务器作用:将ubuntu中指定的文件下载到开发板中 安装步骤 1. 首先需要保证ubuntu组网成功 2. 安装tftp服务器安装包 3. 在家目录下,创建tftpboot文件夹,并且添加最高…

5.11 Vue配置Element UI框架

Vue配置Element UI框架 目录一、 概要二、 开发前准备1. 搭建Vue框架 三、 安装 Element UI1. 引入 Element UI 依赖2. 在 main.js 中引入 Element UI 和相关样式:3. 按需引入(非必须, 可忽略)4. 简单构建一个主页面 目录 一、 概要 Element UI 是一个基于 Vue.js …

【算法】01背包问题(代码+详解+练习题)

题目: 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整…

代码随想录算法训练营第二十七天|131.分割回文串、93.复原IP地址

文档链接:https://programmercarl.com/ LeetCode131.分割回文串 题目链接:https://leetcode.cn/problems/palindrome-partitioning/ 思路:把回溯的树画出来就好很多。startIndex用来控制切割的位置 例如对于字符串abcdef: 组…

【T5模型源码】深入T5模型:源码解析与实现细节

【T5模型源码】深入T5模型:源码解析与实现细节 文章脉络 模型结构图 类关系分析 简单类的源码 T5LayerNorm T5DenseActDense T5DenseGatedActDense T5LayerFF 复杂类的源码 常见参数介绍 最难的T5Attention源码 常见面试提问 总结 我们在日常业务中可能…

上传本地项目到gitee仓库(简单快速)

目录 前提准备 1.已经下载好git Bash 2.已经注册好gitee账号 3.在gitee上新建一个仓库 上传项目到gitee 1.找到本地需要传的文件目录 2.在本页面右键空白处,点击Git Bash Here 3.检查gitee账号是否存在或是否正确 4.若不正确或不存在则配置用户名和邮箱 5…

Matlab|【核心复现】同时考虑考虑孤岛与重构的配电网故障恢复运行策略

目录 主要内容 基本知识 1.问题引出 2.可控负荷 3.网络拓扑约束 4.算法流程 结果一览 1.原文结果 2.程序运行结果 下载链接 主要内容 该模型复现文章《同时考虑考虑孤岛与重构的配电网故障恢复运行策略》,以IEEE33配电网为分析对象,…

OceanMind海睿思数据工程2.0重磅发布,赋能企业“韧性”成长!

近日,由江苏省工业和信息化厅指导,江苏省企业信息化协会主办的 2024制造业数字化转型南京高峰论坛 圆满落幕。 中新赛克海睿思 作为长三角地区数字化转型优秀厂商代表受邀参会,并发布全新数据工程系列产品。中新赛克副总兼大数据产品线总经理…