当前位置: 首页 > 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;大部分其实很难应…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...