数据结构速成--栈

news2024/10/6 8:34:40

        由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 

目录

一、栈的基本概念

二、栈的存储结构

1. 顺序栈的实现

2. 顺序栈的基本实现

2.1 初始化

2.2 判断栈空

2.3 数据进栈

2.4 数据出栈

3. 共享栈

4. 栈的链式存储结构

三、栈的使用场景


一、栈的基本概念

        栈是只允许在一端进行插入或删除操作的线性表。限定这种线性表只能在某一端进行插入和删除操作。栈操作的特性是后进先出。
        栈顶:线性表允许进行插入删除的那一端。
        栈底:不允许进行插入和删除的另一端。
        空栈:不含任何元素的空表。

        n个不同元素进栈,出栈元素不同排列的个数为\frac{1}{n+1}C_{2n}^{n}。 

        第一部分大家记清楚栈只能从栈顶插入和删除,以及后进先出的特性,还要知道出栈种类计算。 

二、栈的存储结构

        栈是一种操作受限的线性表,类似于线性表,它也有对应的两种存储方式。

1. 顺序栈的实现

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

#define MaxSize 50 //定义栈中元素的最大个数
typedef struct{
    ElemType data[MaxSize]; //存放栈中元素
    int top; //栈顶指针
}SqStack;

2. 顺序栈的基本实现

2.1 初始化

void InitStack(SqStack &S){
    S.top=-1; //初始化栈顶指针
}

2.2 判断栈空

bool StackEmpty(SqStack S){
    if(S.top==-1) //栈空
        return true;
    else //不空
        return false;
}

2.3 数据进栈

bool Push(SqStack &S,ElemType x){
    if(S.top==MaxSize-1) //栈满,报错
        return false;
    S.data[++S.top]=x; //指针先加1,再入栈(注意顺序)
    return true;
}

2.4 数据出栈

bool Pop(SqStack &S,ElemType &x){
    if(S.top==-1) //栈空,报错
        return false;
    x=S.data[S.top--]; //先出栈,指针再减1(注意顺序)
    return true;
}

例:入栈序列为1,2,3,4,5,则出栈序列不可能为(     )

A. 4 3 5 1 2              B. 5 4 3 2 1              C. 4 5 3 2 1             D. 1 2 3 4 5

        本道题选A。这类题是栈最常考的题目,想要做好这种题一定要记住栈后进先出的特性。最简单的就是B,1 2 3 4 5一口气全都进栈,然后依次出栈,故B正确。对于C,1 2 3先入栈,4入栈后立刻出栈,然后5再入栈也立即出栈,最后1 2 3再出栈,就是4 5 3 2 1,故C正确。对于D很明显就是进一个元素,这个元素就立即出栈,故D正确。而A,1 2先进栈,3 4入栈后立即出栈才会是4 3开头,5入栈后立即出栈,所以前3位是4 3 5,但是1 2出栈只能是2 1,故A错误。:

3. 共享栈

        利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。

        共享栈是为了更有效的利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢,有利于减少上溢发生。 

4. 栈的链式存储结构

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

typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}*LiStack;

         第二部分大家主要掌握顺序栈栈空/满的条件,给出的例题非常重要。

三、栈的使用场景

        栈能适用于递归算法,表达式求值以及括号匹配等问题中。 

        第三部分就一句话,三种场景大家记一下,后面两个最常出现!

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

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

相关文章

【ROS2】搭建ROS2-Humble + Vscode开发流程

【ROS2】搭建ROS2-Humble Vscode开发流程 文章目录 【ROS2】搭建ROS2-Humble Vscode开发流程1.基本环境配置2.搭建Vscode开发环境 1.基本环境配置 基本的环境配置包括以下步骤: 安装ROS2-Humble,可以参考这里安装一些基本的工具,可以参考…

Linux LVM与磁盘配额

目录 一.LVM概述 LVM LVM机制的基本概念 PV(Physical Volume,物理卷) VG(Volume Group,卷组) LV(Logical Volume,逻辑卷) 二.LVM 的管理命令 三.创建并使用LVM …

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好,有幸与屏幕前你们相识,博主现已经搬砖9年,趁着头发还充裕,希望给大家提供一些编程领域的帮助,深知计算机毕业生这个阶段的崩溃与闹心,让我们共同交流进步。 博主给大家列举了项目合集&#…

Android Studio修改项目包名

1.第一步,项目结构是这样的,3个包名合在了一起,我们需要把每个包名单独展示出来 2.我们点击这个 取消选中后的包名结构是这样的,可以看到,包名的每个文件夹已经展示分开了,现在我们可以单独对每个包名文件夹…

ubuntu+安装Google Protobuf 库

本文参考文章如下 https://blog.csdn.net/wzw1609119742/article/details/119712422#t18https://blog.csdn.net/j8267643/article/details/134133091https://blog.csdn.net/jax_fanyang/article/details/135937002?spm1001.2014.3001.5502 现在论坛上据大部分的教程都是下面…

【深度学习实战(5)】使用仿射变换来实现自己的letter_box操作

一、letter_box 深度学习模型输入图片的尺寸为正方形,而数据集中的图片一般为长方形,粗暴的resize会使得图片失真,采用letterbox可以较好的解决这个问题。该方法可以保持图片的长宽比例,剩下的部分采用灰色填充。 二、代码 本例…

✌粤嵌—2024/4/3—合并K个升序链表✌

代码实现: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

本地搭建属于你自己的AI搜索引擎 支持多家AI模型

FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器,并使用 MULTI LLM 生成答案,无需 GPU。用户可以提出问题,系统将进行多引擎搜索,并将搜索结果合并到LLM中,并根据搜索结果生成答案。全部免费使用。 项目…

老王讲IT:名片管理系统

综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************************************************** 欢…

MySQL 基础使用

文章目录 一、Navicat 工具链接 Mysql二、数据库的使用1.常用数据类型2. 建表 create3. 删表 drop4. insert 插入数据5. select 查询数据6. update 修改数据7. delete 删除记录truncate table 删除数据 三、字段约束字段1. 主键 自增delete和truncate自增长字段的影响 2. 非空…

16 - Debian如何配置vsftpd(1)实现匿名上传下载

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置vsftpd(1)实现匿名上传下载 《傅老师Debian小知识库系列之16》——原创 前言 傅老师Debian小知识库特点&#xff1a…

保护C#代码的艺术:深入浅出代码混淆技术

摘要 在C#开发中,代码的保护是一个不可忽视的问题。本文深入探讨了几种常用的C#代码混淆工具,帮助开发者理解如何有效地保护代码不被反编译。同时,本文也对混淆技术的优缺点进行了分析,并提供了一些实际使用的建议。 引言 C#是…

实战:通用二进制格式安装 MySQL(mysql-5.7.29)-2024.4.6(测试成功)

目录 文章目录 目录实验环境下载url安装相关包准备用户准备二进制程序准备环境变量准备配置文件生成数据库文件,并提取root密码准备服务脚本和启动修改口令测试登录安全初始化(可选)shell一键安装关于我最后 实验环境 mysql-5.7.29 centos7.6 1810软件位…

centos 更新系统时间

在CentOS中更新系统时间 1 检查当前时间: date 2 更新时间: 手动设置时间,但更常见的是通过网络同步时间。CentOS通常默认使用NTP(Network Time Protocol)来同步时间。 如果尚未安装NTP,请先安装它&#…

Servlet-Filter实现反爬虫

以前用DotNetCore实现过反爬虫功能。在tomcat里面可以利用Servlet的Filter类实现请求的控制来达到反爬虫功能,进而增强JRT的web安全。 实现黑名单过滤器,对在黑名单列表的IP的所有请求都跳转到警告页面,业务各种请求自行定义加入黑名单 /* …

leetcode:42.接雨水

单调栈解题思路: 需要知道当前遍历到的元素左边和右边第一个比该元素大的元素。 如果当前遍历到的元素大于栈顶元素,则该元素为栈顶元素右边第一个比它大的元素,此时,栈顶元素的栈内相邻元素是该元素左边第一个比它大的元素。【…

项目中,如何写 readme.md 文件 | 写项目总结

tips:注意写 1. readme文件:①项目文档(项目需求和设计文档、项目系统架构和技术文档、接口文档)、②项目结构、③启动项目。具体结构见下文。 2. 项目总结:技术栈、描述、主要工作!!需求及功…

Python SQL解析和转换库之sqlglot使用详解

概要 Python SQLGlot是一个基于Python的SQL解析和转换库,可以帮助开发者更加灵活地处理和操作SQL语句。本文将介绍SQLGlot库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装SQLGlot库非常简单,可以使用pip命令进行安装: pip install sqlglot安装完成后…

MajorDoMo thumb.php 未授权RCE漏洞复现(CNVD-2024-02175)

0x01 产品简介 MajorDoMo是MajorDoMo社区的一个开源DIY智能家居自动化平台。 0x02 漏洞概述 MajorDoMo /modules/thumb/thumb.php接口处存在远程命令执行漏洞,未经身份验证的攻击者可利用此漏洞执行任意指令,获取服务器权限。 0x03 影响范围 MajorD…

十大排序——6.插入排序

这篇文章我们来介绍一下插入排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 插入排序的要点如下所示: 首先将数组分为两部分[ 0 ... low-1 ],[ low ... arr.length-1 ],然后,我们假设左边[ 0 ... low-1 ]是已排好序的部分…