顺序栈,栈篇(画图教您顺序栈的进栈出栈操作)

2023-05-16

数据结构专升本学习,栈篇(顺序栈)

前言:

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

每日一遍,快乐无极限,哈哈哈

006HJgYYgy1fsnwkm97z3g305k05kguo

1.什么是栈

我们先学习一下栈的逻辑,在编程中逻辑是非常重要的东西,只要我们会了逻辑,然后会了语言,基本上是可以,用两个图来让大家理解一下栈的逻辑。

图一是一个逻辑图,很抽象,很好理解,记住后进先出或者,先进后出,是不是发现这两句话,倒时候会和队列搞反,所以,我们引用生活来记忆这个逻辑,看图二。

image-20211031231645785

这个图是结合生活画的一个逻辑图,一个死胡同一个一个的进去,最后只能是后进的先出来,先进去的在最后出来,大家可以开动脑洞想一想,生活中还有那些这样的逻辑,可以方便我们记忆,博主想的有,手枪弹夹,我们以前用到老式手电筒的电池,还有我们小时候玩的压人,就几个小朋友,一个一个的往上压下面的那个小朋友,大家脑补一下那个画面,可以增强我们对栈的逻辑。😂😂😂😂

image-20211031225034547

2.认识代码,认识我们的工具

2.1 建立栈我们需要认识的代码,总结一下

大致流程图就是这样:

image-20211101165922184

我们需要认识一些代码及含义

1.#define DataType int  //把int类型自定义一下
2.#define MAXSIZE 10 //MAXSIZE代表最大的栈空间
3.typedef struct{
    DataType data[MAXSIZE];
    int top;                  //这个就是栈顶,因为我们是顺序栈所以没用指针
}SeqStack;//这个是顺序表栈的一个类型
4.(SeqStack*)malloc(sizeof(SeqStack));这个在链表中用过,划分内存空间
5.SeqStack* s; 定义一个栈
6.int Push_SeqStack(SeqStack* s, DataType x) //入栈操作,s代表栈,x代表我们入栈的值
7.int Pop_SeqStack(SeqStack* s, DataType* x){  //出栈操作,s代表栈,指针x代表输出的值,博主用的指针,实参为地址

2.2 初始化顺序栈

初始化顺序栈,就是把栈生成 ,划分内存空间,然后在那个数组里面存值,讲人话就是:(一个结构体指针指向一个结构体,而这个结构体里面有一个数组和一个整形变量,就是数组的下标,然后每次存值那个整形变量自增,出栈就是整形变量自减)

typedef struct{
    DataType data[MAXSIZE];
    int top;
}SeqStack;
 
SeqStack* Init_SeqStack(){  //栈初始化
    SeqStack* s;
    s = (SeqStack*)malloc(sizeof(SeqStack)); //划分内存空间
    if(!s){//判断内存空间的划分是否成功
        printf("空间不足\n");
        return NULL;
    }else{
        s->top = -1;//栈空以-1标记
        return s;  //返回栈
    }
}

int Empty_SeqStack(SeqStack* s){  //判断栈空
    if(s->top == -1)//我们初始化的时候定义了栈空为-1标记,所以以-1结束
        return 1;
    else
        return 0;
}

2.3 入栈和出栈操作

int Push_SeqStack(SeqStack* s, DataType x){  //入栈操作,s代表栈,x代表我们入栈的值
    if(s->top == MAXSIZE - 1)//如果我们栈满了入栈就会失败,为什么要减一是因为栈是0位置开始,出栈到-1结束
        return 0;//栈满不能入栈
    else{
        s->top++;   //我们入栈栈顶要加一
        s->data[s->top] = x; //将我们的值入栈
        return 1;//成功
    }
}
 
int Pop_SeqStack(SeqStack* s, DataType* x){  //出栈操作,s代表栈,指针x代表输出的值,博主用的指针,实参为地址
    if(Empty_SeqStack(s))//判断是不是空栈
        return 0;//栈空不能出栈
    else{
        *x = s->data[s->top]; //把栈顶的值赋值给指针x,代表出栈了
        s->top--; //出栈之后我们要栈顶减一
        return 1;
    }//栈顶元素存入*x,返回
}

2.4 效果演示,和整体代码

image-20211101165242711

顺序栈效果就是上面这样,整体代码我放到下面,大家可以跑一下

#include <stdio.h>
#include <malloc.h>
#define DataType int
#define MAXSIZE 10
 
typedef struct{
    DataType data[MAXSIZE];
    int top;
}SeqStack;
 
SeqStack* Init_SeqStack(){  //栈初始化
    SeqStack* s;
    s = (SeqStack*)malloc(sizeof(SeqStack));
    if(!s){
        printf("空间不足\n");
        return NULL;
    }else{
        s->top = -1;
        return s;
    }
}
 
int Empty_SeqStack(SeqStack* s){  //判栈空
    if(s->top == -1)
        return 1;
    else
        return 0;
}
 
int Push_SeqStack(SeqStack* s, DataType x){  //入栈
    if(s->top == MAXSIZE - 1)
        return 0;//栈满不能入栈
    else{
        s->top++;
        s->data[s->top] = x;
        return 1;
    }
}
 
int Pop_SeqStack(SeqStack* s, DataType* x){  //出栈
    if(Empty_SeqStack(s))
        return 0;//栈空不能出栈
    else{
        *x = s->data[s->top];
        s->top--;
        return 1;
    }//栈顶元素存入*x,返回
}
 
 
int Print_SeqStack(SeqStack* s){
    int i;
    printf("当前栈中的元素:\n");
    for(i = s->top; i >= 0; i--)
        printf("%3d", s->data[i]);
    printf("\n");
    return 0;
}
 
int main(){
    SeqStack* L;//定义结构体指针
    int n, num, m;
    int i;
    L = Init_SeqStack(); //初始化栈
    printf("初始化完成\n");
    printf("栈空:%d\n", Empty_SeqStack(L)); 
    printf("请输入入栈元素个数(不得超过 %d 个):\n",MAXSIZE);//最大入栈的个数为MAXSIZE
    scanf("%d", &n);//输入我们入栈的个数
    printf("请输入要入栈的%d个元素:\n", n);
    for(i = 0; i < n; i++){
        scanf("%d", &num);//循环调用,赋值我们要入栈的元素
        Push_SeqStack(L, num);
    }
    Print_SeqStack(L);//这个函数是如果之前栈中有的值输出一次
    printf("请输入要出栈的元素个数(不能超过%d个):\n", n);
    scanf("%d", &n);//我们需要输出的元素个数
    printf("依次出栈的%d个元素:\n", n);
    for(i = 0; i < n; i++){
        Pop_SeqStack(L, &m);//这个函数是出栈,m实参传地址过去,对应的形参是整形指针变量
        printf("%3d", m);//输出m
    } 
    printf("\n");   
    return 0;
}

总结:

顺序栈是比较简单的,我们可以简单的理解为一个带有下标的一维数组,并且这个下标不能随意跳转一直在最后的位置,进栈这个下标就自增,出栈就自减,栈是一个很好数据结构,它在算法中也运用的很多。例如经典的汉诺塔问题就可以用栈解决,在递归中也用的比较多,大致博主的理解就是这样,如果有错误的地方,希望大家及时指教,我们下一篇讲链式栈,创作不易希望大家,点赞,关注,评论。

上一篇:数据结构专升本学习笔记,线性表链表

下一篇:数据结构专升本学习,栈篇(链式栈的进栈出栈操作)

6a04b428ly1fyot3kptr3g206o06o43f

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顺序栈,栈篇(画图教您顺序栈的进栈出栈操作) 的相关文章

  • [详解]ArchLinux安装

    1 无线网络连接 如果你用的是有线网络 xff0c 请直接跳过此章节 iwctl span class token comment 进入iwctl span 进入后 xff1a device list span class token co
  • CSP CCF: 202012-2 期末预测之最佳阈值 (C++)

    目录 题目来源题目描述解题过程完整代码 题目来源 链接 CCF 期末预测之最佳阈值 题目描述 解题过程 题目要求为选取合适的安全指数阈值 Theta xff0c 使得该阈值对这 m 位同学上学期的挂科情况进行预测 xff0c 预测正确的次数
  • C++ 中将 Char 转换成 String

    64 TOC 概览 使用 string string size type count charT ch 构造器使用 push back 使用append 使用 insert 使用string string size type count c
  • CSP CCF: 201809-3 元素选择器 (C++)

    目录 题目来源数据特点知识点30分60分80分代码完整思路100分 题目来源 元素选择器 数据特点 知识点 大小写转换 xff1a tolower 大写转小写 xff08 其他字符不会变 xff09 c 43 43 大小写字符 数字的判断及
  • 51单片机0-99秒表计数器+60秒倒计时(数码管两位数)

    51秒表计数器 43 倒计时 xff08 数码管两位数 xff09 一 xff1a 简介 我们实践的效果是用数码管显示0 99并在按下 转换键 后 xff0c 实现60秒倒计时 xff0c 并用蜂鸣器报警提示 xff0c 兼并计数器和倒计时
  • 系统调用的理解

    文章目录 系统调用什么是系统调用系统调用的分类系统调用与库函数的区别 系统调用 什么是系统调用 什么是系统调用 xff1f 答 操作系统的接口函数是连接应用软件与操作系统的中间桥梁 xff0c 系统调用其实就是操作系统提供给应用程序的接口函
  • AndroidStudio配置过程中遇到的一些问题

    自己在安装并配置Android Studio时遇到的一些坑 xff0c 写出来方便大家解决问题 问题一 xff1a BUILD FAILED in 1s Failed to create parent directory C Program
  • STM32F103C8T6汇编点灯

    最简单的结构 只有一个数据段 只是为了不报错而已 area Reset span class token punctuation span data span class token punctuation span readonly sp
  • vscode c++连接mysql

    因为踩坑太多所以写下该篇博客 首先要下载mysql 这里用的是MySQL8 0 16 记住mysql的安装路径 xff0c 主要是include和lib的路径 参考另外一个博主的文章https blog csdn net mzlogin a
  • python之 下载及安装Anaconda

    Python Python是一种面向对象的解释型计算机程序设计语言 xff0c 其使用 xff0c 具有跨平台的特点 xff0c 可以在Linux macOS以及Windows系统中搭建环境并使用 xff0c 其编写的代码在不同平台上运行时
  • UI自动化之TouchAction(dirver).long_press()长按

    之前篇说过driver tap可以通过duration参数设置实现长按 xff0c 除外TouchAction也可以 xff0c 而且还可以用之实现多个点击的事件集 xff0c 废话不多说直接贴码 xff1a span class toke
  • python之 ffmpeg+opencv绿幕抠图,蒙版绿幕抠图,透明化处理,PIL检测图片是否包含透明通道

    目录 OpenCV Python实现绿幕图像抠图 python利用蒙版批量抠图并实现透明化 jpeg格式图片进行批量背景透明化处理 PIL检测图片是否包含透明通道 OpenCV Python实现绿幕图像抠图 boy png xff1a 最终
  • pandas将千万行数据分块保存为CSV文件,保存为HDF5文件

    从数据库读取数据保存为CSV xff0c 然后转换为HDF5 xff0c 用于后面数据快速处理 span class token keyword from span sqlalchemy span class token keyword i
  • NOIP 2002 普及组第四题 过河卒

    题目描述 棋盘上 A 点有一个过河卒 xff0c 需要走到目标 B 点 卒行走的规则 xff1a 可以向下 或者向右 同时在棋盘上 C 点有一个对方的马 xff0c 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 因此称之为 马拦过河
  • Ubuntu18.04安装

    一 制作系统U盘 1 下载Ubuntu18 04系统镜像文件 进入Ubuntu官网 xff0c 先找到Download xff0c 再找到以前的发行版本 older releases xff1a 选择64位的Desktop image xf
  • maven下手动导入ojdbc6-12.1.0.1-atlassian-hosted.jar

    在终端输入如下命令 xff1a mvn install install file Dfile 61 E ojdbc6 12 1 0 1 atlassian hosted jar DgroupId 61 com oracle Dartifac
  • BIOS 和 UEFI

    BIOS 和 UEFI 是电脑的两种启动模式 xff0c 也就是开机后最先执行的程序 它们都是固件 xff0c 程序已经预先写入到芯片中 BIOS是传统的启动方式 xff0c UEFI是一种新的启动方式 xff0c 现在的出的电脑基本都是用
  • 安装双系统后直接进入Ubuntu没有grub引导项

    解决问题 xff1a 安装win10 43 Ubuntu18 04双系统后 xff0c 开机直接进入Ubuntu没有grub引导项 原因 xff1a 没有为Ubuntu的启动项配置grub 如何配置 xff1f 首先在终端执行如下命令打开g
  • VNC 配置使用

    被控制的计算机系统Ubutnu18 04 xff0c 控制的计算机系统Windows10 1 下载 Download VNC Server VNC Connect 被控制的计算机下载Server版 xff0c 控制的计算机下载Viewer版
  • UTC和GMT的区别

    GMT xff1a Greenwich Mean Time 格林尼治标准时间 是以英国格林尼治天文台观测结果得出的时间 xff0c 这是英国格林尼治的当地时间 xff0c 是世界时间的标准 UT xff1a Universal Time 世

随机推荐

  • 基于MAML的改进方法总结

    元学习是解决小样本学习问题的重要方法之一 xff0c 现已取得较为优异的成绩 元学习方法大体上可以分为基于优化的和基于度量两种 基于度量的方法是非参数方法 xff0c 包括孪生网络 关系网络 匹配网络等 基于优化的方法是参数化方法 xff0
  • list与dict互转

    keys span class token operator 61 span span class token punctuation span span class token string 39 a 39 span span class
  • 进栈出栈操作

    首先简单输入n 代表输入数字的个数 xff0c 然后依次进栈 xff0c 再出栈输出每个数字 xff08 栈是一种先进后出的数据结构 xff09 span class token macro property span class toke
  • 指针笔记

    指针的两种写法注意 xff1a int c 61 1 int p 61 amp c 或 int p p 61 amp c xff1b 这两种写法是相等的 另外注意野指针的概念 xff1a 1 野指针的错误来源就是指针定义了以后没有初始化 x
  • Echarts中国地图根据数据对省份渲染不同的颜色

    在 setOption 里面设置 xff08 setOption官方参数及用法介绍 xff09 title span class token comment 标题设置 span legend span class token comment
  • Ubuntu22.04系统安装+显卡驱动安装

    制作Ubuntu系统启动盘 推荐rurus 选择GPT分区 xff0c UEFI引导 xff08 可以cmd运行msinfo32可以看到 xff09 Ubuntu系统卸载 关于up主里面Ubuntu引导项删除出现问题 xff0c 可以采用下
  • error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or

    error while loading shared libraries libssl so 10 cannot open shared object file No such file or directory 一 依赖文件下载地址 根据
  • ArchLinux安装(VirtualBox)

    VirtualBox配置 1 启用EFI 2 选择光驱 安装ArchLinux 1 查看是否开启EFI span class token comment ls sys firmware efi efivars span 2 查看是否能上网
  • linux查看端口状态&防火墙开放端口

    1 查看防火墙状态 查看防火墙状态 systemctl status firewalld 开启防火墙 systemctl start firewalld 关闭防火墙 systemctl stop firewalld 开启防火墙 servic
  • 【递归】_求解_斐波拉契数列

    斐波纳契数列 xff08 Fibonacci sequence xff09 是数学界十分著名的数列 有著名的兔子问题 xff0c 斐波那契数列又称 兔子数列 黄金分割数列 这个看上去很简单的数列 xff0c 却总是出现在人们的眼前 蜻蜓翅膀
  • 【JS】数组去重

    JS 数组去重 有一个数组 arr 61 a c b c e d a f e g b a g 要求去除掉数组中重复的元素 xff01 案例分析 xff1a 目标 xff1a 把旧数组里面不重复的元素选出来放到新数组中 xff0c 重复的元素
  • Win11 更新完检测不到音频设备

    打开电脑经过一番重大更新发现音频设备找不到了 xff01 xff01 一整懵 解决方案 xff1a 1 开始 搜索 设备管理器 2 展开 系统设备 3 找到 英特尔 R 智音技术音频控制器 右键点击 更新驱动程序 4 点击第二个 浏览我的计
  • python之邮件发送简易篇

    span class token comment coding utf 8 span span class token keyword import span smtplib span class token keyword from sp
  • 我犯的一个低级错误

    谨以此篇记录这个弱智的错误 2022 4 20晚 今天测试一个SpringBoot的CRUD项目时遇一个奇怪的报错 如下图 错误信息是 Releasing transactional SqlSession org apache ibatis
  • IDEA如何修改背景图片

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 修改IDEA背景图片 前言一 先来分享一下我的IDEA背景图片二 步骤总结 前言 习惯了IDEA默认的黑色与白色背景 xff0c 很多人都
  • C#关于枚举(enum)类型与整型、字符串相互转换的总结

    C 关于枚举 enum 类型与整型 字符串相互转换的总结 首先 xff0c 声明枚举类型的变量 xff1a span class token comment 除枚举类型转换成整数类型示范中修改了该代码 xff0c 其他均采用此枚举类型的声明
  • 通过获取RGB值,使用ffmpeg生成RGB颜色的视频

    前台获取数据 第一步从前台获取需要用到的数据 xff0c 包括节目名称 xff0c 帧率 xff0c 亮度 xff0c RGB的值 后台拿到数据需要先对文件名称进行校验 xff0c 如节目名称已存在则直接抛出异常 xff0c 就不需要进行生
  • 阿里云服务器centos7上手安装-2 创建新用户

    创建新用户 span class token function sudo span adduser newUserName span class token function passwd span newUserName span cla
  • P1591阶乘数码 (全WA!!为啥??)

    题目 xff1a 求 n n 中某个数码出现的次数 输入格式 第一行为 t t 10 xff0c 表示数据组数 接下来 tt 行 xff0c 每行一个正整数 n n 1000 和数码 a 输出格式 对于每组数据 xff0c 输出一个整数 x
  • 顺序栈,栈篇(画图教您顺序栈的进栈出栈操作)

    数据结构专升本学习 xff0c 栈篇 xff08 顺序栈 xff09 前言 xff1a 上次我们学了 xff0c 线性表里面的的链表 xff0c 今天我们学栈 xff0c 用官方的术语就是 xff0c 栈作为一种数据结构 xff0c 是一种