栈的基本内容

2023-05-16

一  栈的定义

栈是限定仅在表尾进行插入和删除操作的线性表。

通常把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称为LIFO结构(Last In First Out)。

栈首先是一个线性表,也就是说,栈的元素具有线性关系,既前驱后继关系,在线性表中的表尾在栈中指的是栈顶。

栈的插入操作,也叫做进栈,也称为压栈,入栈。

栈的删除操作,叫做出栈,也有的叫做弹栈。

栈的顺序储存结构

首先来看栈的结构定义:

typedef int selemtype;//类型根据实际需要而定,现在先定义为int类型
typedef struct
{
    selemtype data[maxsize];
    int top;//用于栈顶指针
}sqstack;

之后进行进栈的操作:

status push(sqstack*s,selemtype e)
{
    if(s->top==maxsize-1)//栈满
    {
        return error;
    }
    s->top++;//栈顶指针增加一
    s->data{s->top}=e;//将新插入的元素赋值给栈顶空间
    return ok;
}

最后出栈操作:

status pop(sqstack*s,selemtype e)
{
    if(s->top==-1)//栈满
    {
        return error;
    }
    *e=s->data[s->top];//将要删除的栈顶元素赋值给e
    s->top--;//栈顶指针减一
    return ok;
}

三 两栈共享空间

数组有两个端点,两个栈有两个栈底,让一个栈的栈底成为数组的始端,既下标为0处,另一个成为数组的末端,既下标为n-1处。两个栈增加新元素,两个端点就向中间延伸。

那什么时候栈满呢?想想极端情况,若栈2 是空栈,栈1 的top1等于n-1时,就是栈一满了。反之,当栈1 为空栈时,top2等于0时,为栈2 满。两个栈见面时,也就是两个指针之间相差1 时,既top1+1=top2为栈满。

四 栈的链式储存结构

同链表类似,链式储存结构的优点是基本不存在栈满的情况,除非内存已经没有可以使用的空间,如果真的发生,那么此时的计算机操作系统基本上面临崩溃的边缘,而不是这个链式栈是否溢出的问题。

通常情况下都将栈顶放在链表的头部,这样头指针的作用基本上失去了意义,对于链式栈来说是不需要头结点的。

对于空栈来说,链表的原定义是头指针指向空,那么链式栈的空其实就是top=NULL的时候。

链式栈的进栈和出栈的操作与链表的插入删除操作基本一样,链表那里打好了基础链式栈基本就没有问题。

进栈操作:

Status push(linkstack*s,selemtype e)
{
    linkstackptr s=(linkstackptr)malloc(sizeof(stacknode));
    s->data=e;
    s->next=S->top;//把当前栈顶元素赋值给新结点的直接后继
    S->top=s;//将新结点s赋值给栈顶指针
    S->count++;
    return OK;
}

出栈操作:

Status pop(linkstack*s,selemtype*e)
{
    linkstackptr s=(linkstackptr)malloc(sizeof(stacknode));
    *e=S->top->data;
    p=S->top;//将栈顶结点赋值给p
    S->top=S->top->next;//使栈顶的指针移向下一位,指向后一结点
    free(p);//释放结点p
    S->count--;
    return OK;
}

链式栈的进栈和出栈操作都很简单,没有任何的循环操作,时间复杂度均为o(1);

五 栈的应用

栈的应用主要是在递归的运用,在使用递归函数时,编译器使用栈实现递归,我们在平常调试代码的时候是注意不到的,实际上编译器进行函数的递归调用的时候就是使用了栈来存储和查找数据最后来进行汇总的。

栈还有一个应用就是四则运算表达式求值,既后缀(逆波兰)表示法定义,后缀表达式不同于我们平常的正常思维,在这里说不清楚,附上链接单独讲后缀表达式。https://blog.csdn.net/weixin_44015865/article/details/85098378

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

栈的基本内容 的相关文章

  • ::在C++中的意思

    表示作用域 xff0c 和所属关系 class A int A test 表示test是属于A类的 关于 的具体解析 xff1a 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0
  • 【Linux问题解决】操作系统用C语言多线程编程 对‘pthread_create’未定义的引用 报错解决办法

    操作系统用C语言多线程编程 对 pthread create 未定义的引用 报错解决办法 今天写操作系统作业 在Ubuntu Linux系统中用C语言编写多线程程序 在命令行进行编译 没通过编译 报错如下 xff1a In file inc
  • linux 服务器执行post请求 curl命令详解

    什么是curl xff1f curl是一个命令行访问URL的计算机逻辑语言的工具 xff0c 发出网络请求 xff0c 然后得到数据并提取出 xff0c 显示在标准输出 stdout 上面 xff0c 可以用它来构造http request
  • open-falcon 监控cpu指标及含义

    user 30512019 从系统启动开始累计到当前时刻 xff0c 用户态的CPU时间 xff0c 不包含nice值为负进程 nice 2905 从系统启动开始累计到当前时刻 xff0c nice值为负的进程所占用的CPU时间 syste
  • [Unity] 串口读取数据错误 IOException: 拒绝访问。

    错误内容 IOException 拒绝访问 System IO Ports WinSerialStream ReportIOError System String optional arg at lt 14e3453b740b4bd690e
  • px4仿真无法起飞问题(Failsafe enabled: no datalink)

    报错信息 问题描述 xff1a 使用JMAVSim和gazebo仿真px4起飞时报错如下 xff1a WARN commander Failsafe enabled no datalink 说不安全 解决方法 打开QGC 就可以起飞了
  • TCP (传输控制协议)和 UDP

    传输控制协议 xff08 TCP xff0c Transmission Control Protocol xff09 是一种面向连接的 可靠的 基于字节流的传输层通信协议 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输
  • 全网第一篇 Jetson AGX Xaiver + Jetpack5.0.2(Ubuntu20.04) + ROS2 + ORB-SLAM3 + ZED2

    本机系统 xff1a Jetpack5 0 2 Ubuntu 20 04 LTS 注意事项 xff1a 想要避坑 xff0c 务必按照文中版本准备各种环境 一 安装软件 1 Pangolin 0 5 网址 xff1a https githu
  • java中char转化为int的几种方法

    java中char转化为int的几种方法总结 方法一 xff1a 在char后面 0 span class token keyword public span span class token keyword class span span
  • 大疆 RoboMaster 3508/2006/GM6020 电机使用教程

    19年开始使用大疆的电机 xff0c 刚开始接触有很多东西不懂 xff0c 网上除了RM官网提供的一些资料外没有很多其他的资料 xff0c 现在使用大疆电机近一年了 xff0c 想分享一下自己的经验 1 硬件部分 1 C610电调只能连接M
  • DBC文件解析及CAN通信矩阵

    一般的 DBC 文件中包含了如下的8种信息 xff1a 1 版本与新符号 2 波特率定义 3 网络节点的定义 4 报文帧的定义 5 信号的定义 6 注解部分 7 特征部分 8 数值表部分 VERSOIN 34 34 版本信息 xff0c 为
  • 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图

    文章目录 前言一 ROS分布式通信 xff08 配置多机通信 xff09 1 简介2 步骤2 1 准备2 2 修改配置文件2 3配置主机IP2 4配置从机IP 二 RPlidar的使用教程1 创建环境2 下载激光雷达的功能包3 编译4 启动
  • TCP连接建立的步骤

    TCP连接建立的步骤 一 客户端向服务器端发送连接请求后 xff0c 就被动地等待服务器的响应 典型的TCP客户端要经过下面三步操作 xff1a 1 创建一个Socket实例 xff1a 构造函数向指定的远程主机和端口建立一个TCP连接 x
  • 能否在头文件中放置函数定义?

    语法上是可以这样做的 xff0c 但是在编程规范中并不鼓励这样做 成员函数一般是不可以在头文件中定义的 xff0c 只能在头文件中声明 因为函数只能有一次定义 xff0c 而可以有多次声明 xff0c 当头文件被多次包含的时候 xff0c
  • 万能的sprintf

    0 前言 先推荐一本书 xff0c 政治书籍 政治的人生 xff0c 算是一本日记题材 是现任 xff0c 作者大家百度一下就知道了 xff0c 这里不宜过多说明 从这本书里 xff0c 可以看出来现在的社会 这本书是30年前的 大佬就是大
  • 串口通讯UART/RS232/RS485/RS-422笔记

    串口通讯详解笔记 串口通讯概述串口通讯传输数据帧的结构UARTRS232RS485RS 422RS 232 RS 422和RS 485的主要区别 xff08 重要 xff09 串口通讯概述 串口通讯是指数据按位 xff08 bit xff0
  • Stm32 hal库 usart2与hc-08透传模块通讯

    Stm32 hal库 usart2与hc 08透传模块通讯 xff08 附数据解析 xff09 一 stm32cubeMX配置 1 配置RCC为外部晶振 2 配置时钟树 3 配置usart1 usart2 xff0c 其中usart1将作为
  • darknet分类网络,训练,C++调用分类器

    Darknet 分类器 出于对Darknet框架下YOLO结构的火热 xff0c 网络上一堆关于目标检测的C 43 43 调用形式和模板 xff0c 但是未曾存在C 43 43 调用分类器的模板 xff0c 故采用如下形式 xff0c 展开
  • zed2 win10 采集数据

    环境 xff1a win10 cuda10 2 zed2相机 zed sdk 3 7 python3 7 1 标定 参考的博客 2 配置环境 1 xff09 win10安装cuda cudnn 如何查看windows的cuda版本 win1

随机推荐