第4部分数据结构与算法提高班【参考】.docx

第4部分数据结构与算法提高班【参考】.docx

  1. 1、本文档共59页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 4 部分 数据结构与算法提高班24.1 栈、队列、单调队列、单调栈(高天宇)24.2 堆、并查集、加权并查集(高天宇)54.3 倍增算法(高天宇)84.4 基础数论(高天宇)104.5 前缀和与差分,STL 选讲(高天宇)134.6 NOIP 历年题目分析与讲解(高天宇)174.7 NOIP 模拟赛(李佳蔚)254.8 比赛策略和骗分技巧(李佳蔚)254.9 搜索及优化(张晨)324.10 最短路、最小生成树(张晨)374.11 线段树与树状数组(谢兴宇)444.12 背包 dp、简单树型 dp(马龙)474.13 动态规划及常见优化(马龙)56第 4 部分 数据结构与算法提高班4.1 栈、队列、单调队列、单调栈(高天宇)4.1.1 栈 栈的定义栈(stack)是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运 算。这一端被称为栈顶,相对地,把另一端称为栈底。 计算机中的栈计算机中调用函数时,函数信息便保存在堆栈当中。 栈的实现 .1 栈的存储DataType stack_data[STACK_SIZE]; // 通常 DataType 都是 int int top = 0; // 栈顶指针,初始时栈为空 .2 判断栈是否为空bool isStackEmpty(){return top == 0;} .3 判断栈是否为满bool isStackFull(){return top == STACK_SIZE – 1;} .4 进栈操作bool push(DataType x){if (isStackFull()) return false; stack_data[++top] = x;return true;} .5 出栈操作查询+删除:bool pop(DataType &x){if (isStackEmpty()) return false; x = stack_data[top--];return true;}只查询:DataType get_top() { return stack_data[top]; } 栈的应用4.1.2 队列 队列的定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除(查询)操作, 而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除(查询)操作的端称为 队头。 队列的实现 .1 队列的存储DataType queue_data[QUEUE_SIZE]; // DataType 通常为 intint front = 0, tail = 0; // 队首和队尾指针。队首指针指向第一个元素,队 尾指针指向最后一个元素后面的位置。 .2 判断队列是否为空bool isQueueEmpty(){return front == tail;} .3 判断队列是否为满bool isQueueFull(){return tail >= QUEUE_SIZE;} .4 入队(插入)bool push(DataType x){if (isQueueFull()) return false; queue_data[tail++] = x;} .5 出队(查询,删除)查询(无空队列检查):DataType get_front() { return queue_data[front]; }删除:bool pop(){if (isQueueEmpty()) return false; front++;return true;} .6 循环队列我们注意到,进行 pop(弹出)操作后,队列数组前端有许多空闲下来的存储空间,如 果能将其利用则队列存储效率更高。我们可以用『循环队列』的方式来节省空间。当我们的队首或者队尾指针变成 QUEUE_SIZE 的时候,将其对 QUEUE_SIZE 取模变为0。这样就实现了让队列『首尾相接』,循环起来了。这样判断队满的条件不再是 tail>=QUEUE_SIZE,而是 tail==front。不过这样和判断队 空的条 件冲 突了。 我们 可以 通过牺 牲一 个存 储单元 的方 式, 将判断 队满 的条 件改成tail==front-1。只需要将原先程序里面 front++和 tail++的部分改成 front = (front + 1) % QUEUE_SIZE和 tail = (tail + 1) % QUEUE_SIZE 即可。 .7 双端队列即可以在两端进行删除/查询/插入操作的队列,在普通队列的基础上稍加升级即可。 队列的应用 4.1.3 单调队列,单调栈 何为单调队列和单调栈单调队列/单调栈,顾名思义,即保证内部元素单调(从大到下或者从小到大)的队列 或者栈。我们只要在插入新元素的时候

您可能关注的文档

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档