当前位置: 首页 > news >正文

数据结构——栈(Stack)

目录

前言

一、栈的概念

1、栈的基本定义

 2、栈的特性

二、栈的基本操作

1.相关操作概念

2.实现方式

(1)顺序栈

(2)链式栈

三、栈的应用

总结



前言

        栈(Stack)是一种常见且重要的数据结构,它遵循后进先出(Last-In-First-Out, LIFO)的原则,即最后加入的元素会是第一个被移除的。

        由于栈是一种特殊的线性表,其实现方式主要有两种:

1、用顺序表实现,顺序表内容可参考: 数据结构——顺序表

2、用链表实现,单向链表内容可参考: 数据结构——单向链表


一、栈的概念

1、栈的基本定义

        栈是一种线性表(俗称堆栈),它限制只能在一端(称为栈顶)进行插入和删除操作,另一端(称为栈底)是固定的,不允许进行插入和删除操作,栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针,当栈中没有元素时称为“空栈”。最大特点 :后进先出(LIFO)

        就如同往箱子里面放置书本,一本一本地放在里面,但是你想拿出来的时候,只能从表面一本一本地往下取,不可能从底部开始取书一个道理。

 2、栈的特性

        1、后进先出:栈中最后一个插入的元素首先被删除。

        2、栈顶浮动,栈底固定:栈顶的位置随着元素的入栈和出栈而变化,而栈底则保持不变。

        3、不支持随机访问:栈的结构决定了只能在栈顶进行插入和删除操作,无法直接访问和修改栈中间的元素。

二、栈的基本操作

1.相关操作概念

        1、入栈(Push)将一个元素添加到栈顶,使其成为新的栈顶元素。入栈操作需要将元素放到栈顶位置,并更新栈顶指针。

        2、出栈(Pop)将栈顶元素删除,并返回该元素的值。出栈操作需要将栈顶元素删除,并更新栈顶指针。

        3、判空(Empty)判断栈是否为空,即栈中是否没有任何元素。

        4、获取栈顶元素(Top)获取栈顶元素的值,但不删除该元素。

        5、销毁栈(DestroyStack)销毁栈,并释放栈占用的存储空间。

        等待

2.实现方式

(1)顺序栈

        采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。

        先创建顺序表:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef int data_t;
typedef struct {data_t *data;//栈数据指针int maxlen;//栈空间,即数据数组最大长度int top;//栈顶指针
}sqstack;//创建顺序表,需要传入顺序表数据长度
//同时初始化栈空间
sqstack * stack_create(int len)
{sqstack * s;if ((s =(sqstack *)malloc(sizeof(sqstack))) == NULL) {printf("malloc sqstack failed\n");return NULL;}if ((s->data = (data_t *)malloc(len * sizeof(data_t)))==NULL) {printf("malloc data failed\n");free(s);return NULL;}memset(s->data, 0, len*sizeof(data_t));s->maxlen = len;s->top = -1;return s;
}

        顺序表实现各种操作:

//压栈,即入栈
int sqtack_pusqh(sqqsqtack * sq, data_t data) 
{if (sq == NULL) {printf("sq isq NULL\n");return -1;}if (sq->top == sq->maxlen-1) {printf("sqtack isq full\n");return -1;}sq->top++;sq->data[sq->top] = data;return 0;
}//栈是否为空,1为空
int sqtack_empty(sqqsqtack *sq) 
{if (sq == NULL) {printf("sq isq NULL\n");return -1;}return (sq->top == -1 ? 1 : 0);
}//栈是否已满,1为满状态
int sqtack_full(sqqsqtack *sq) 
{if (sq == NULL) {printf("sq isq NULL\n");return -1;}return  (sq->top == sq->maxlen-1 ? 1 : 0);
}
//出栈
data_t sqtack_pop(sqqsqtack *sq) 
{if(sqtack_empty(*sq))  // 栈空,无法出栈  {   printf("Stack is empty!\n");  return -1;  }  sq->top--;return (sq->data[sq->top+1]);
}
//获取栈顶数据
data_t sqtack_top(sqqsqtack *sq) 
{return (sq->data[sq->top]);
}
//清除栈空间
int sqtack_clear(sqqsqtack *sq) 
{if (sq == NULL) {printf("sq isq NULL\n");return -1;}sq->top = -1;return 0;
}
//栈空间释放
int sqtack_free(sqqsqtack *sq) 
{if (sq == NULL) {printf("sq isq NULL\n");return -1;}if (sq->data != NULL) free(sq->data);free(sq);return 0;
}

(2)链式栈

        采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。链栈通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。

        插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。

        先创建单向链表:

#include <stdio.h>
#include <stdlib.h>typedef int data_t;
typedef struct node {data_t data;struct node *next;
}listnode, *linkstack;//创建单向链表,并初始化栈空间
linksqtack sqtack_create(void) 
{linksqtack sq;sq = (linksqtack)malloc(sqizeof(lisqtnode));if (sq == NULL) {printf("malloc failed\n");return NULL;}sq->data = 0;sq->next = NULL;return sq;
}

        链表实现各种操作:

//压栈,也即入栈
int sqtack_pusqh(linksqtack sq, data_t data) 
{linksqtack p;if (sq == NULL) {printf("sq isq NULL\n");return -1;}p = (linksqtack)malloc(sqizeof(lisqtnode));if (p == NULL) {printf("malloc failed\n");return -1;}p->data = data;//p->next = NULL;p->next = sq->next;sq->next = p;return 0;
}
//出栈
data_t sqtack_pop(linksqtack sq) 
{linksqtack p;data_t t;p = sq->next;sq->next = p->next;t = p->data;free(p);p =NULL;return t;
}
//判空
int sqtack_empty(linksqtack sq) 
{if (sq == NULL) {printf("sq isq NULL\n");return -1;}return (sq->next == NULL ? 1 : 0);
}
//获取栈顶数据
data_t sqtack_top(linksqtack sq) 
{return (sq->next->data);
}
//释放栈空间
linksqtack sqtack_free(linksqtack sq) 
{linksqtack p;if (sq == NULL) {printf("sq isq NULL\n");return NULL;}while (sq != NULL) {p = sq;sq = sq->next;printf("free:%d\n", p->data);free(p);}return NULL;
}

三、栈的基本应用

         1、函数调用栈:在程序中,函数的调用和返回过程可以通过栈来管理。每当一个函数被调用时,相关的信息(如参数、局部变量等)被压入栈中,当函数返回时,这些信息会被弹出栈。
        2、表达式求值:栈可以用于处理表达式的求值过程,特别是中缀表达式转换为后缀表达式的过程。通过栈的先进后出特性,可以方便地进行运算符的优先级判断和操作符的计算。
        3、括号匹配:栈可以用于检查括号是否匹配。遍历字符串中的括号,当遇到左括号时,将其压入栈中;当遇到右括号时,弹出栈顶元素并检查是否与当前右括号相匹配。
        4、编辑器的撤销操作:在文本编辑器或图形编辑器中,撤销操作可以通过栈来实现。每次进行操作时,将操作的状态保存到栈中,当需要撤销时,从栈中弹出最近的状态,恢复到之前的状态。
        5、浏览器的前进后退功能:浏览器的前进和后退功能可以通过两个栈来实现。一个栈用来保存浏览过的网页,另一个栈用来保存后退的网页。

        。。。。。。


完结

        有误之处望指正!!!

相关文章:

数据结构——栈(Stack)

目录 前言 一、栈的概念 1、栈的基本定义 2、栈的特性 二、栈的基本操作 1.相关操作概念 2.实现方式 &#xff08;1&#xff09;顺序栈 &#xff08;2&#xff09;链式栈 三、栈的应用 总结 前言 栈&#xff08;Stack&#xff09;是一种常见且重要的数据结构&#xff0c;它遵循…...

修改pom.xml为阿里云仓库并且让他生效

一、项目pom.xml添加 <repositories><repository><id>aliyun-central</id><name>Aliyun Maven Central</name><url>https://maven.aliyun.com/repository/central</url></repository><repository><id>aliyu…...

step13:qml/qt程序打包

文章目录 0.文章介绍1.软件发布2.准备打包软件3.双击开始运行打包软件4.点击安装5.参考连接 0.文章介绍 1.软件发布 打包之前需要先发布&#xff0c;参考教程连接 2.准备打包软件 官方下载地址&#xff1a;http://www.jrsoftware.org/isdl.php#stable 下载之后一路点击下一…...

招聘求职小程序

本文来自&#xff1a;ThinkPHPFastAdmin招聘求职小程序 - 源码1688 应用介绍 一款基于ThinkPHPFastAdmin开发的原生微信小程序招聘管理系统。 前端小程序演示&#xff1a; 后台管理网址&#xff1a; https://fastadmin.site100.cn/PbfhegDBAJ.php/index/login 网盘链接&#x…...

10分钟学会docker安装与使用

文章目录 1、docker简介2、docker的基本组成3、docker的安装与配置4、docker的常用命令 1、docker简介 什么是容器&#xff1f; 它是一种虚拟化的方案&#xff0c;是操作系统级别的虚拟化&#xff0c;只能运行相同或相似内核的操作系统&#xff0c;依赖于Linux内核特性&#x…...

vue3、uniapp-vue3模块自动导入

没有使用插件 使用插件,模块自动导入 安装: npm i -D unplugin-auto-importvite.config.js (uniapp没有此文件,在项目根目录下创建) import { defineConfig } from "vite"; import uni from "dcloudio/vite-plugin-uni"; import AutoImport from &qu…...

Ubantu设置国内镜像(阿里云、华为云)

1. 确定系统版本 国内有很多 Ubuntu 的镜像源&#xff0c;包括阿里的、网易的&#xff0c;还有很多教育网的源&#xff0c;比如&#xff1a;清华源、中科大源等。 不同的 ubantu 版本对应的镜像源有所不同&#xff0c;所以需要先查看系统的版本号&#xff1a; lsb_release -a…...

Redis远程字典服务器(3)——常用数据结构和单线程模型

目录 一&#xff0c;常用数据结构 1.0 前言 1.1 string 1.2 hash 1.3 list 1.4 set 1.5 zset 1.6 演示 二&#xff0c;关于单线程模型 2.1 关于Redis的单线程 2.2 Redis为什么快 一&#xff0c;常用数据结构 1.0 前言 Redis是采用键值对的方式来存储数据的&#…...

[Qt][按钮类控件]详细讲解

目录 0.按钮状态说明1.Push Button2.Radio Button3.Check Box4.Tool Button 0.按钮状态说明 clicked&#xff1a;⼀次 ⿏标按下⿏标释放 触发pressed&#xff1a;鼠标按下时触发released&#xff1a;鼠标释放时触发toggled&#xff1a;checked属性改变时触发 1.Push Button QP…...

数据结构(5.5_2)——并查集

逻辑结构——数据元素之间的逻辑关系 并查集&#xff1a; 并查集&#xff08;Union-Find&#xff09;是一种树型的数据结构&#xff0c;用于处理一些不交集的合并及查询问题。它支持两种操作&#xff1a; 用双亲表示存储并查集 首先将所有根节点数组值设为-1&#xff0c;其…...

Java Web —— 第四天(Maven)

Maven是什么 Maven 的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型(POM) POM (ProjectObject Model): 项目对象模型 Maven的作用 项目构建:提供标准的、跨平台的自动化项目构建方式 依赖管理:方便快捷的管理项目依赖的资源 (ar包)&…...

2024年电脑录屏软件推荐:捕捉屏幕,记录生活,分享精彩

在众多电脑录屏软件中&#xff0c;如何挑选出一款适合自己的工具呢&#xff1f;今天&#xff0c;我们就来为大家对比评测四款热门电脑录屏软件&#xff1a;福昕REC、转转大师录屏、爱拍录屏和轻映录屏。通过对它们的功能、性能、操作便捷性等方面进行对比&#xff0c;帮助你找到…...

oracle 增删改查字段

在Oracle数据库中&#xff0c;对表字段的增删改查是数据库操作的基础。以下是关于Oracle中如何增加、删除、修改和查询字段的详细解释&#xff1a; 1. 增加字段&#xff08;Add&#xff09; 增加字段的语法为&#xff1a; ALTER TABLE 表名 ADD (字段名 数据类型 [DEFAULT 默…...

给不规则的shapeGeometry贴图

首先看一下贴图效果&#xff0c;我们要做的是将一个长方形的贴图在不规则的多边形中贴图 实现思路 1. 取不规则多边形的box2&#xff0c;这个box2就是整个贴图的UV坐标 2. 计算每个不规则的多边形顶点的在该box2上的对应映射 3. 更新整个geometry的uvs数据 怎么计算映射&…...

网络层IP协议报头字段的认识

认识IP协议 IP协议&#xff08;Internet Protocol&#xff09;&#xff0c;又称网际协议&#xff0c;是整个TCP/IP协议栈中的核心协议之一&#xff0c;位于网络层。IP协议是互联网中最基础的网络协议之一&#xff0c;负责在网络中传输数据包。它定义了数据包的格式、地址分配和…...

Linux部署MySQL8.0

目录 一、部署前准备1.1、查看系统版本和位数&#xff08;32位或64位&#xff09;1.2、下载对应安装包 二、开始部署1、将安装包解压并且移动到目标安装目录2、准备MySQL数据和日志等存储文件夹3、准备MySQL配置文件 my.cnf4、创建mysql单独用户组和用户&#xff0c;将安装目录…...

二叉树中的深搜

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 计算布尔二叉树的值 1.1 题目描述 1.2 题解 1.3 代码实现 2. 求根节…...

固态继电器行业知识详解

固态继电器&#xff08;SSR&#xff09;是一种通过电子元件来实现开关功能的器件&#xff0c;与传统的电磁继电器相比&#xff0c;它具有更高的可靠性、耐用性和响应速度&#xff0c;广泛应用于工业自动化、家用电器和各种电子控制系统中。本文将详细探讨固态继电器的工作原理、…...

【practise】数组中出现次数超过一半的数字

关于我&#xff1a; 睡觉待开机&#xff1a;个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想&#xff0c;就是为了理想的生活! 作者留言 PDF版免费提供&#xff1a;倘若有需要&#xff0c;想拿我写的博客进行学习和交流&#xff0c;可以私信我将免费提供PDF版。…...

RAGFlow v0.9 重磅升级,支持 GraphRAG,开启下一代 RAG 之旅!

一、引言 前面我们介绍过很多的关于大模型和RAG相关的技术&#xff0c;通过其关注程度足以看到市场上对RAG框架和成熟产品的迫切需求&#xff0c;因为想要个人独立从0开始实现一个RAG产品并非易事&#xff0c;虽然有相当多的RAG或者知识库开源产品&#xff0c;大部分其实很难应…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...