C语言栈与队列知识,C语言数据结构基础学习笔记——栈和队列

2023-11-08

之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列。

栈是只允许在一端进行插入或删除的线性表。

栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1;当栈为满栈时,top=MaxSize-1。顺序栈的定义为:

#define MaxSize 50 //定义栈中元素的最大个数

typedef struct{

Elemtype data[MaxSize]; //存放栈中元素

int top; //栈顶指针

}SqStack; //顺序栈的简写

顺序栈的入栈操作为:

bool Push(SqStack &S,ElemType x){

if(S.top==MaxSize-1) return false;

S.data[++S.top]=x; return true;

}

顺序栈的出栈操作为:

bool Pop(SqStack &S,ElemType &x){

if(S.top==-1) return false;

x=S.data[S.top--];

return true;

}

顺序栈读取栈顶元素为:

bool GetTop(SqStack S,ElemType &x){

if(S.top==-1) return false;

x=S.data[S.top];

return true;

}

顺序栈读取栈顶元素与出栈操作对比,注意读取栈顶元素时栈顶指针没有自减。

对于一个数组,如果只从数组头部开始入栈,并没有达到很高的空间利用率,因此我们引入共享栈的概念。共享栈是两个栈共用同一个数组,分别从数组头部和数组尾部开始开始入栈。其定义为:

#define MaxSize 100 //定义栈中元素的最大个数

typedef struct{

Elemtype data[MaxSize]; //存放栈中元素

int top1; //栈1顶指针

int top2; //栈2顶指针

}SqDoubleStack; //共享栈的简写

bool Push(SqStack &S,ElemType x,int stackNum){

if(S.top1+1==S.top2) return false;

if(stackNum==1) S.data[++S.top1]=x;

else if(stackNum==2) S.data[--S.top2]=x;

return true;

}

共享栈的满栈条件是top1+1=top2。

同时,栈也有链式存储结构,叫作链栈,它空栈时top=NULL,一般不会满栈。链栈的定义为:

typedef struct SNode{

ElemType data; //数据域

struct SNode *next; //指针域

}SNode,*SLink; //链式栈的结点

typedef struct LinkStack{

SLink top; //栈顶指针

int count; //链式栈结点数

}LinkStack;

栈有着丰富的应用场景,比较经典的题目有括号的匹配以及后缀表达式的求值。

①括号的匹配:给你一串杂乱的大,中,小括号的序列,让你判断这里的括号序列满不满足数学计算的规律(括号套括号)。主要思路是将所有的左括号依次入栈,碰到右括号出栈匹配,若是不同种的括号返回false,若是同一种括号则继续以上操作,直到空栈并且数组中的字符串遍历完成,返回true。

②后缀表达式的计算:后缀表达式是计算机最喜欢的一种表达式方式,例如(5+10+1*13)/14这个中缀表达式,它的后缀表达式为5 10 + 1 13 * + 14 /,其将每一步计算的运算符号置后。利用栈计算后缀表达式的主要思路是:①将数字5入栈,再将数字10入栈;②当指针碰到运算符+时,将栈中的前两个元素出栈进行计算(后出栈的数在前位),结果入栈,如本例值15入栈;③同上一步,计算1*13得13入栈,此时栈底值15,栈顶值13;④同上一步,指针碰到运算符+,将15与13求和,得值28入栈;⑤再同上一步,计算28/14=2入栈;⑥此时字符串数组遍历完毕,栈中的唯一值2则为表达式的结果。

栈思想的最重要的一个应用便是递归,递归是指在一个函数、过程或数据结构中的定义中又应用了它自身的编程思想。理解递归的一个基础方法便是找到递归式和递归边界,我们来看两个例子:

①用递归求n的阶乘:

int F(int n){

if(n==0) return 1; //递归边界

else return n*F(n-1); //递归式

}

②求斐波那契数列的第n项:

int Fib(int n){

if(n==0) return 0; //递归边界

else if(n==1) return 1; //递归边界

else return Fib(n-1)+Fib(n-2); //递归式

}

递归式是每一次递归过程的计算核心,而递归边界就是每一次递归的结束标志。

另一种特殊的线性表是队列,队列的定义是只允许在一端进行插入,而在另一端进行删除的线性表。

队列的顺序存储结构是顺序队列,其定义为:

#define MaxSize 50 //定义队列中元素的最大个数

typedef struct{

Elemtype data[MaxSize]; //存放队列中元素

int front,rear; //队头指针和队尾指针

}SqQueue;

但对于一个数组队列来说,每一次入队和出队都会浪费一个数组位置,于是我们引入循环队列的概念,队尾指针rear在指到队尾后会回到下标为0的位置(利用取余来实现),即每一次rear和front的更新基于以下操作:rear=(rear+1)%MaxSize,front=(front+1)%MaxSize。

但是这样又产生了新的问题,rear=front到底是队空还是队满无法判断。这样的问题有以下两种解决办法:①设一个frag,作为标志位,当队满时frag=1;②牺牲一个数组位置,保留一个空余单元,此时队满的判断标准变成了(rear+1)%MaxSize=front,队列中的元素数计算方法为:(rear-front+MaxSize)%MaxSize。

循环队列的入队操作为:

bool EnQueue(SqQueue &Q,ElemType x){

if((Q.rear+1)%MaxSize==Q.front) return false; //队满

Q.data[Q.rear]=x;

Q.rear=(Q.rear+1)%MaxSize;

return true;

}

循环队列的出队操作为:

bool DeQueue(SqQueue &Q,ElemType &x){

if(Q.rear==Q.front) return false; //队空

x=Q.data[Q.front];

Q.front=(Q.front+1)%MaxSize;

return true;

}

队列链式存储的定义为:

typedef struct{

ElemType data; //数据域

struct LinkNode *next; //指针域

}LinkNode; //链式队列的结点

typedef struct{

LinkNode *front,*rear; //队头和队尾指针

}LinkQueue;

链式队列的入队和出队类似于链表的相应操作。

标签:return,递归,队列,C语言,MaxSize,front,数据结构,rear

来源: https://www.cnblogs.com/jackliu-timecomplexity/p/10581043.html

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

C语言栈与队列知识,C语言数据结构基础学习笔记——栈和队列 的相关文章

  • Redis初级命令

    一 常用key命令 查看所有key keys 查看key的类型 type key 返回状态1 0 True False 当传入多个key时返回or的结果 即只要有一个存在就返回True exists key key 将key从当前db移动到
  • 学生成绩管理系统数据库设计--MySQL

    MySQL 数据库设计 学生成绩管理系统 设计大纲 友情链接 1 医疗信息管理系统数据库 MySQL 2 邮件管理数据库设计 MySQL 3 点餐系统数据库设计 SQL Server 4 商品管理系统数据库设计 SQL Server 5 S
  • JavaEE架构之传统三层架构,集群架构,分布式架构,微服务架构

    javaEE架构 1 传统三层架构 all in one项目 传统三层架构大致可以分为表现层 业务层和持久层 数据访问层 其中表现层负责接受请求和转发请求 业务层负责处理请求 注 事务管理 日志记录等AOP类型的操作均封装在这一层 持久层主
  • 将web项目导出到远程服务器的tomcat中

    将web项目导出到远程服务器的tomcat中 前期准备 步骤 前期准备 eclipse2017创建的web项目 阿里云服务器中存在tomcat 远程连接工具 windows自带 步骤 1 在eclipse上将完成好的web项目导出为war文
  • ubuntu linux安装pytorch和torchvision

    1 下载镜像 镜像网址 https download pytorch org whl torch stable html 假设你要下载torch1 4 0版本 cp36代表你的环境是python3 6 cu100代表的是你的cuda是10
  • C语言大作业学生成绩管理系统

    1 设计要求 利用所学的知识 理论和实际结合 利用资源 采用模块化的结构 使用模仿修改自主设计相结合的方法 锻炼学生综合分析解决实际问题的编程能力 通过C语言各个函数功能来实现对学生信息的管理 学生信息包括学生姓名 学号 各科成绩 管理方式
  • c++中的成员访问级别和派生继承方式

    1 一个类中的不同变量和函数的访问属性 总共有三种访问级别 public private protected 在类中定义的成员变量和成员函数的时候 如果不在变量前面加上访问级别修饰符 类中默认为私有成员变量或者私有成员函数 而在结构体中如果
  • OOALV data_changed 與data_changed_finished事件

    data changed在可編輯字段的數據發生變化時才會觸發 可用來檢查輸入數據的正確性 data changed finished在回車時和可編輯字段數據發生變化后 光標移動時觸發 如果可編輯字段數據檢查失敗 則不會觸發此事件 這兩個事件
  • 服务器端hsm芯片,数据加密服务CloudHSM

    数据加密服务 CloudHSM 基于国密局认证的物理加密机 Hardware Security Module HSM 利用虚拟化技术 提供弹性 高可用 高性能的数据加解密 密钥管理等云上数据安全服务 符合国家监管合规要求 满足金融 互联网等
  • 戴尔r410服务器虚拟磁盘,DELL服务器R410原装 SAS 6/IR RAID卡 阵列控制器卡 支持RAID0,1...

    SAS 6 iR 功能 Dell 串行连接 SCSI 6 iR 集成控制器和适配器 用户指南 介绍了 Dell串行连接 SCSI SAS 6 iR 控制器的规格 下表对 SAS 6 iR 适配器和 SAS 6 iR 集成控制器的规格进行了比
  • KITTI数据集之点云地图构建

    本文描述了如何通过KITTI数据集 读取激光雷达点云数据 并通过ground truth 对前后两帧点云进行旋转变换 使得二者统一坐标系 不断叠加点云进行点云建图的过程 使用的是KITTI odometry中的07号数据集 其主要内容包括
  • android BSP

    HAL 硬件抽象层 BootLoader 硬件初始化管控 Linux Device Driver Linux 内核驱动
  • Macbook pro搭建unbutu18.04的步骤(省钱又实惠)

    第一步 下载parallels desktop 链接 https pan baidu com s 17Bqw0rWezrfOMLZqTaImag 密码 h0z5 注意 在线下载 离线安装 省钱省事 永久自动激活 小编花了十块钱 第二步 运行
  • AppsFlyer 研究(二)应用内事件

    一 记录应用内事件 应用内事件可助您深入了解应用里正在发生的事 我们建议您花些时间定义要记录的事件 记录应用内事件有助于您衡量KPI 例如ROI 投资回报率 和LTV 生命周期价值 有几种方法可以记录应用内事件 最常见的方法是通过我们在本文
  • Activiti7工作流+idea2021监听器法器的使用

    法器 这次需要个好宝贝 4 监听器 工作流的开头都是创建bpmn文件 注意一点细节问题 需要加监听器了 首先我们得有一个监听器 package listener import org activiti engine delegate pub
  • 2023年电赛---运动目标控制与自动追踪系统(E题)关于网友的问题回复

    如果有嵌入式企业需要招聘校园大使 湖南区域的日常实习 任何区域的暑假Linux驱动实习岗位 可C站直接私聊 或者邮件 zhangyixu02 gmail com 此消息至2025年1月1日前均有效 前言 1 各位私信问问题之前 看看自己的问
  • prometheus监控docker容器实战

    1 cAdvisor介绍 要监控docker状态 需要使用一个软件cAdvisor cAdvisor Container Advisor 是Google开源的容器资源监控和性能分析工具 它是专门为容器而生 可以用于收集正在运行的容器资源使用
  • 企业级日常巡检脚本的编写

    1 系统信息 1 1 操作系统类型 查看操作系统类型命令为 uname 例 root host 134 uname Linux 定义变量 os type uname 1 2 操作系统版本号 查看操作系统版本号命令为 cat etc redh
  • 【论文阅读】Learning Spatio-Temporal Representation with Pseudo-3D Residual Networks

    论文阅读 Learning Spatio Temporal Representation with Pseudo 3D Residual Networks 虽然这是一篇17年ICCV的论文 但是这篇论文里没有使用kinetics数据集 可能

随机推荐

  • 在UFT中使用描述性编程

    在 UFT 中使用描述性编程是一个提高UFT脚本利用率的很好的方式 通常UFT是通过对象库来识别不同的对象 而描述性编程是UFT另外一种能够识别对象的途径 它不依赖于对象库 通过增加一些对象的描述来识别对象的 说明 本例子是以Flight飞
  • 一个问答机器人模型该如何构建

    构建一个问答机器人模型 通常需要以下步骤 准备数据 需要大量的问题和答案对 以供模型学习 预处理数据 可能需要对数据进行分词 词性标注 去停用词等操作 以便输入模型进行训练 选择模型类型 常用的问答机器人模型类型有基于知识库的模型 基于生成
  • 网工学习笔记

    1 什么是IP地址 IP地址 Internet Protocol Address 互联网国际地址 是一种在Internet上的给主机编址的方式 它主要是为互联网上的每一个网络和每一台主机分配一个逻辑地址 以此来屏蔽物理地址的差异 IP地址就
  • APP脱壳之MDEX的使用步骤

    并不是每一个APP都会加壳 根据以往的经验 一般情况下加壳的有两种情况 第一种是像360公司 腾讯 百度这些公司 他们有自己的加壳技术 就会给自己需要加壳的产品都会加壳 第二种是普通APP 包括但不限于一些色情类的 或者其他用户体量不大的A
  • Cuda 学习教程六:执行模型

    Cuda 学习教程六 执行模型 今天看到一篇讲解CUDA模型的文章 很不错 转载记录一下 CUDA编程4 执行模型 上
  • 雨滴桌面插件大全_电脑技巧之桌面美化,字体美化,透明效果全都有

    Windows技巧 桌面美化篇 电脑的日常使用中 相信百分之九十九的玩家的电脑显示得最多的不是游戏也不是办公软件 而是桌面 一个干净整洁甚至是漂亮的桌面能够大幅度提高电脑日常使用的幸福感 今天我就来分享一下电脑的桌面美化软件 1 字体美化
  • 解决缺少api-ms-win-crt-runtime-

    答主在安装MongoDB的时候 遇到了api ms win crt runtime 1 1 0 dll的问题 历经两天时间终于解决 下面是我的解决历程 首先是这个图 这个是因为没有微软的visual2015c 运行库环境 需要安装 地址 h
  • 刷脸识别改变支付零售日常生活

    据对相貌特征信息的生物辨认技能促就了刷脸付的诞生 并且付宝官方力推刷脸付旨在替代了扫码付出 当然新型的刷脸付款方式关于很多人仍是比较忧虑的 觉得会存在必定安全隐患 那么刷脸付安全吗 有保证吗 那么下面就来解答大家所忧虑的刷脸付安全性问题 早
  • webpack打包入口指定某文件夹内所有js作为入口文件

    webpack config js webpack config js const path require path const glob require glob module exports 指定 packs 文件夹下的 js 文件作
  • Navicat连接MySQL时弹出:1045:Access denied for user ‘root’@’localhost’

    错误原因 当登录MySQL数据库出现 Error 1045 错误时 表明你输入的用户名或密码错误被拒绝访问了 也可能是你的账号不允许从远程登录 只能在localhost本地登录数据库 解决办法如下 用管理员权限打开cmd 并且cd进入mys
  • 点云读取加速c++ ASCii 模式ply 或者txt

    相较于Qt Qtextstream的性能提升十倍 本文点云格式特殊 有需要自行修改即可 QFile dataFile fileName bool ret dataFile open QIODevice ReadOnly QIODevice
  • 浅谈JS的微任务和宏任务(附加面试题)

    Event Loop 因为JS是单线程 就是说 同一个时间只能做一件事 为了协调事件 用户交互 脚本 UI 渲染和网络处理等行为 防止主线程的不阻塞 Event Loop 的方案应用而生 掌握知识点 JS分为同步任务和异步任务 同步任务都在
  • (C语言)指针初识(1)——指针概念及指针类型

    指针 看似是一个令人头疼的问题 静下心来慢慢学习 指针这个主题 分成了几个的板块 比较多 耐心看完 一定会有收获啦 慢慢来 总是需要一个循序渐进的过程 目录 一 什么是指针 二 指针和指针类型 指针类型的意义 结论1 结论2 一 什么是指针
  • vue 和 react的对比

    vue 比react的优缺点 对比1 github 全球开发者星星点赞数量 此数据结果摘取于 2021年3月份 结论 vue 胜出 尤雨溪一个人撑起一个生态 战胜高手林立的巨头公司facebook 相当的传奇 对比2 React VS Vu
  • easyrecovery2023永久免费版激活密钥,手把手教您用EasyRecovery快速恢复数据

    Ontrack EasyRecovery Crack Professional是一个全面的备份和恢复实用程序 可以从多个数据丢失事件中恢复文件 例如常见的意外删除 更严重的 有时是病毒引起的 分区或驱动器格式化 甚至硬盘严重损坏后的数据丢失
  • 阿里Java代码规范

    代码规范 一 编程规约 一 命名风格 二 常量定义 三 代码格式 四 OOP 规约 五 集合处理 六 并发处理 七 控制语句 八 注释规约 九 其它 二 异常日志 一 异常处理 二 日志规约 三 单元测试 四 安全规约 五 MySQL 数据
  • YAML用法详解

    1 简介 YAML YAML Ain t Markup Language j m l 设计目标是方便人类读写 它实质上是一种通用的数据串行化格式 远比 JSON 格式方便 1 1 它的基本语法规则如下 大小写敏感 使用缩进表示层级关系 缩进
  • Spring Cloud之LB-Ribbon调用流程和源码分析(二)

    接着上面的一篇关于Spring Cloud之Open Feign调用流程和源码分析 解析feign在rpc调用的时候lb的组成及底层工作流程 关键组件介绍 ServerList 可以响应客户端的特定服务的服务器列表 ServerListFi
  • python多进程multiprocessing使用,看这篇就够了(二)

    1 上篇都是直接创建Process对象来创建子进程 其实还可以通过继承来创建子进程 来看看Process源码 可以通过承继Process 重写run方法来启动子进程 因为对一个不包括target属性 即当target None时 的Proc
  • C语言栈与队列知识,C语言数据结构基础学习笔记——栈和队列

    之前我们学过了普通的线性表 接下来我们来了解一下两种特殊的线性表 栈和队列 栈是只允许在一端进行插入或删除的线性表 栈的顺序存储结构也叫作顺序栈 对于栈顶指针top 当栈为空栈时 top 1 当栈为满栈时 top MaxSize 1 顺序栈