数据结构基础篇(5)

二十一.栈和队列的定义和特点

    • 栈的定义
      • 栈是一个特殊的线性表,是限定仅在一段(通常是表尾)进行插入和删除操作的线性表
      • 又叫后进后出段的线性表,LIFO结构
    • 栈的概念
      • 栈是仅在表尾进行插入,删除操作的线性表
      • 表尾叫栈顶Top;表头叫栈顶Base
      • 入栈
        • 插入元素到栈顶(表尾)的操作
      • 出栈(弹栈)
        • 从标顶(表尾)删除最后一个元素的操作
    • 栈的应用
  • 操作案例
    • 进制转换
      • 十进制整数N向其他进制数d(二,八,十六)的转换是计算机实现计算的基本问题
    • 括号匹配的检验
      • 表达式中允许包含两个括号:圆括号和方括号
    • 表达式求值
      • 程序设计语言编译中一个最基本的问题,它的实现也需要运用栈
      • 算符优先于算法
      • 表达式的组成
        • 操作数:常数、变量
        • 运算符:算术运算符、关系运算符和逻辑运算符
        • 界限符:左右括弧和表达式结束符
          • 任何一个算术表达式都由操作数、算术运算符和界限符组成
    • 舞伴问题
      • 构造两个队列
      • 依次将队头元素出队配成舞伴
      • 某对为空,则另外一队等待这下一舞曲第一个可获得舞伴

二十二.栈的表示和实现

  • 栈的抽象数据类型的类型定义
    • InistStack(&S) 初始化操作
    • 操作结果:构造一个空栈S
    • DestoryStack(&S) 销毁栈操作
    • 初始条件:栈S已存在
    • 操作结果:栈S被销毁
    • StackEmpty(S) 判断S是否为空栈
    • 初始条件:栈S已存在
    • 操作结果:若栈S为空栈,则返回TRUE,否则FALse
    • StackLength(S) 求栈的长度
    • 初始条件:栈S已存在
    • 操作结果:返回S的元素个数,栈的长度
    • GetTop(S,&e) 取栈顶元素
    • 初始条件:栈S已存在且非空
    • 操作结果:用e返回S的栈顶元素
    • ClearStack(&S) 栈置空操作
    • 初始条件:栈S已存在
    • 操作结果:将S清为空栈
    • Push(&S,e) 入栈操作
    • 初始条件:栈S已存在
    • 操作结果:插入元素e为新的栈顶元素
    • Pop(&S,&e) 出栈操作
    • 初始条件:栈S已存在且非空
    • 操作结果:删除S的栈顶元素a~n,并用e返回其值
  • 栈的表示
    • 由于栈本省就是线性表,于是栈也有顺序存储和链式存储两种实现方式
      • 栈的顺序存储--顺序栈
      • 栈的链式存储--链栈
    • 存储方式
      • 同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素。栈底一般在低地址端
        • 附设top指针,指示栈顶元素在顺序栈中的位置
        • 另设base指针,指示栈底元素在顺序栈中的位置
          • 方便操作,通常top只是真正的栈顶元素之上的下标地址
          • 栈空:base==top指针
          • 栈满:top-base==stacksize
            • 处理方法
              • 报错,返回操作系统
              • 分配更大空间,将原栈内容移动到新栈
        • stacksize表示栈可使用的最大容量
      • 使用数组作为顺序栈存储方式特点
        • 简单,方便,但易产生溢出(数组大小固定)
          • 上溢:栈已经满,又要压入元素
          • 下溢:栈已经空,还要弹出元素
            • 注意:上溢是一种错误,问题没有得到处理;下溢一般判定为结束。
  • 顺序栈的表示

顺序栈的初始化

Status InitStack(SqStack &S)    //构建空栈
{S.base=new SElemType[MAXSIZE];    //S.base=(SElemType*)sizeof(SelemType)if(!S.base)exit (OVERFLOW);    //存储分配失败S.top=S.base;    //栈顶指针等于栈底指针S.stacksize=MAXSIZE;return OK;
}

顺序栈判断栈是否为空

Status StackEmpty(SqStack S)
{if(S.top == S.base)return TRUE;elsereturn FALSE;
}

求顺序栈长度

int StackLength(SqStack S)
{return S.top-S.base;
}

清空顺序栈

Status ClearStack(SqStack S)
{if(S.base)S.top=S.base;return OK;
}

销毁顺序栈

Status DestroyStack(SqStack &S)
{if(S.base){delete S.base;S.stacksize=0;S.base=S.top=NULL;}return OK;
}
  • 顺序栈的入栈
  • 判断栈是否栈满,若满则出错(上溢)
  • 元素e压入栈顶
  • 栈顶指针加1
Status Push(SqStack &S,SElemType e)
{if(S.top-S.base==S.stacksize)    //栈满return ERROR;*S.top++e;return OK;
}
  • 顺序栈的出栈
    • 判断是否为空,若空则出错
    • 栈顶指针减1
    • 获取栈顶元素e
Status Pop(SqStack &S,SElemType &e)    //栈不为空,删除s栈顶元素,用e返回值和Ok,否则返回ERROR
{if(S.top==S.base)    //等价于if(StackEmpty(S))return ERROR;*S.top++e;return OK;
}
  • - 链栈的表示
    • - 链栈是运算受限的单链表,只能在链表头部进行操作
      • - 链栈的特点
        • - 链栈的头指针就是栈顶
        • - 不要头结点
        • - 基本不存在栈满的情况
        • - 空栈相当于头指针指向空
        • - 插入和删除仅在栈顶处执行
typedef struct StackNode
{SElemType data;struct StackNode *next;
}StackNode,*LinkStack;
LinkStack S;

- 链栈的初始化

void InitStack(LinkStack &S)
{S=NULL;return OK;
}

- 判断链表是否为空

Status StackEmpty(LinkStack S)
{if(S==NULL)return TRUE;else return FALSE;
}

 - 链栈的入栈

Status Push(LinkStack &S,SElemType e)
{p=new StackNode //生成新节点pp->data=e;    //将新结点数据域为ep->next=S;    //将新结点插入栈顶S=p;    //修改栈顶指针return OK;
}

- 链栈的出栈

Status Pop(LinkStack &S,SElemType &e)
{if(S==NULL)return ERROR;e=S->data;p=S;S=S->next;delete p;return OK;
}

- 取栈顶元素

SElemType GetTop(LinkStack S)
{if(S!=NULL)return S->data;
}

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

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

相关文章

修改ModelLink在RTX3090完成预训练、微调、推理、评估以及TRT-LLM转换、推理、性能测试

修改ModelLink在RTX3090完成预训练、微调、推理、评估以及TRT-LLM转换、推理、性能测试 1 参考文档2 测试环境3 创建容器4 安装AscendSpeed、ModelLink5 下载LLAMA2-7B预训练权重和词表6 huggingface模型的推理及性能测试7.1 修改torch,deepspeed规避缺失npu环境的问题7.2 修改…

入门指南:使用 Pygame 创建游戏

Pygame 是一个功能强大的 Python 游戏开发库,它提供了丰富的功能和工具,使得创建2D游戏变得简单而有趣。本文将带您逐步学习如何使用 Pygame 创建自己的游戏。无需担心,即使您是一个完全的新手,也可以在本文中找到有用的信息。 什…

C语言编程软件贴吧:探索最佳编程伴侣的奥秘

C语言编程软件贴吧:探索最佳编程伴侣的奥秘 在浩瀚的编程世界中,C语言以其独特的魅力吸引着无数开发者。而对于初学者和资深程序员来说,一款优秀的C语言编程软件无疑是提升编程效率、享受编程乐趣的得力助手。那么,在贴吧这个信息…

期末速成 ——计算机组成原理(2)数值的表示与运算

目录 一、定点数的表示 (一)无符号数和有符号数的表示 (二)机器数的定点表示 (三)原码、补码、反码、移码 (1)原码表示法 二、浮点数的表示 三、溢出判断 (一)采用一位符号位 (二)采用双符号位 四…

Next.js API Routes:构建服务端功能

Next.js 的 API 路由允许你在 Next.js 应用程序中创建独立的服务端功能,这些功能可以处理 HTTP 请求并返回 JSON 数据或其他响应。API 路由位于项目中的 pages/api 目录下,每个文件都会映射到一个特定的 API 路径。 基本示例 pages/api/users.js impo…

【C++】Socket编程基础

文章目录 套接字通信类型名空间套接字函数socket():创建套接字bind()函数:绑定服务器套接字与其地址、端口listen()函数:侦听客户连接connect():连接套接字accept()函数:服务器接受连接,并为该连接创建一个…

在 Vue 应用中下载.doc文档(或任何其他类型的文件)

在 Vue 应用中下载.doc文档(或任何其他类型的文件) 在Vue应用中下载.doc文档(或任何其他类型的文件)通常涉及到后端提供一个文件下载的接口,前端通过发送请求到这个接口来触发文件下载。以下是如何在 Vue 中实现文件下…

LC 旋转 - 模拟对象

原文链接 链接 液晶 (LC) 旋转网格属性允许您以 theta、phi 为单位指定空间变化的 LC 导向。 液晶由杆状分子结构组成,这些分子结构具有相对于长轴的旋转对称性。因此,液晶具有空间变化的单轴光学特性。 相对于分子长轴和分子短轴的折射率称为非寻常 ne …

Python生成requirements.txt的方法

在Python项目中,requirements.txt 文件通常用于列出项目所需的所有Python包及其版本。这样,其他人或系统可以轻松地安装所有必要的依赖项,以确保项目的正确运行。 以下是生成 requirements.txt 文件的几种方法: 方法1:使用 pip freeze 如果你的项目环境中已经安装了所有…

《广告数据定量分析》第3版读书笔记之统计原理

1.点估计与区间估计:可用于求指标误差区间;(不常用) (1)总体比例的置信区间: 通过样本数据计算的比例,估计总体的对应比例的取值范围。主要适用于用户转化漏斗各环节的转化率估计,比如点击率、点击下载率、下载安装率、安装激活率等。 我们可以得到总体百分比的一个…

cad编程软件怎么使用:深入探索与实用指南

cad编程软件怎么使用:深入探索与实用指南 CAD编程软件作为现代设计与制造领域的重要工具,其使用方法和技巧对于提高设计效率和质量至关重要。本文将从四个方面、五个方面、六个方面和七个方面,详细解析CAD编程软件的使用方法,帮助…

SRS介绍及环境搭建

1.SRS简介 SRS(Simple Real-Time Media Server)是一个开源的流媒体服务器,它支持多种流媒体协议,包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等57。SRS主要应用于直播、视频会议等场景,提供实时音视频服…

【刷题(14)】二叉树

一、二叉树基础 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* …

【并发程序设计】12.内存映射

12.内存映射 使一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必再调用read,write&#xff0c;更加高效。 用到的函数 mmap函数 原型&#xff1a; #include <sys/mman.h> void* mmap(void* start, size_…

【GD32】05 - PWM 脉冲宽度调制

PWM PWM (Pulse Width Modulation) 是一种模拟信号电平的方法&#xff0c;它通过使用数字信号&#xff08;通常是方波&#xff09;来近似地表示模拟信号。在PWM中&#xff0c;信号的占空比&#xff08;即高电平时间占整个周期的比例&#xff09;被用来控制平均输出电压或电流。…

MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法

文章目录 问题描述问题原因解决办法方法一&#xff1a;在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息方法二&#xff1a;重载OnOK函数方法三&#xff1a;将所有按钮类型设为普通按钮&#xff0c;并设置其中一个按钮为默认按钮 问题描述 一般情况下编写的MFC对话框程…

HTML语义化标签

<header> 主要用于网页整体顶部&#xff0c;<article>头部&#xff0c;<section>头部 <nav> 导航&#xff0c;一般有主要导航&#xff0c;路径导航&#xff0c;章节导航&#xff0c;内容目录导航 <main> 网页主要区域&#xff0c;一般一个网页…

【运维项目经历|025】企业高效邮件系统部署与运维项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 经验教训与自我提升 展望未来 项目名称 企业高效邮件系统部署与运维项目 项目背景 随着企业…

男人圣经 13

男人圣经 13 进入大我《百忍诀》VS 训练出更高级的默认网络手眼通天 进入大我 现代世界最大的一个好处是给普通人提供了空前的机会。如果你能提供一种比别人好的产品或者服务&#xff0c;你就会脱颖而出。 而人分成大我&#xff08;神性基因&#xff09;、小我&#xff08;兽…