数据结构基础:堆栈队列

本文讲解的主要内容是堆栈队列,其中:

说明:所有源码均可以在idea上调试。


堆的实现(大小顶堆)

  • 介绍:使用对排序对数组进行排序,根据排序规则分为大顶堆和小顶堆
  • 设计思路:
    • 初试化建堆,建完后,堆顶即最大/最小元素。
    • 交换堆顶和数组末尾元素,然后针对剩余的n-1个元素,对堆顶元素进行调整即可。
    • 重复2),直到所有元素有序。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例
    • 源码:
      HeapSort
      https://gitee.com/ljfirst/AlgorithmPractice/tree/master/javaVersion/DataStructure/sort/innerSort/innerSortRealize/HeapSort2.java
    • 测试案例:HeapSort2TestHeapSortTest

查找第K大的元素

  • 介绍:在一组无序的数组中,查找第K大的元素并输出
  • 设计思路:通过快排和堆排两种方式可以实现。
    • 快排:
      • 在一次快排中,数据会根据中间元素分成了两部分
      • 如果中间元素小于K,递归中间元素的右半部分
      • 如果中间元素大于K,递归中间元素的左半部分
      • 如果中间元素正好K,返回中间元素的左半部分
    • 堆排:
      • 构造一个大小为K的大顶堆
      • 数组中K之外的元素与堆顶元素进行对比
      • 比堆顶元素大的,不发生交换
      • 比堆顶元素小的,发生交换,并进行堆整理
      • 返回大小为K的堆
      • 另一种方式维持一个大小为【数组长度 - K】大小的堆,其他同理,返回非堆的K数据。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

优先队列

  • 介绍:将输入的元素按照某种优化级进行存入,每次取出的元素都是优先级最高的。
  • 设计思路:考虑使用堆排序堆元素进行放置。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例


栈的基本功能包括:入栈(push)、出栈(pop)、获取栈顶元素(peek)、获取栈中实际容量(getrealsize)、获取栈中最大容量(getmaxsize)、判空(empty)、查找值(search)、扩容(resize)

数组栈

  • 介绍:使用数组实现栈的功能。
  • 设计思路:
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

链表栈

  • 介绍:使用链表实现栈的功能
  • 设计思路:
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

双栈实现队列

  • 介绍:使用栈实现队列的功能
  • 设计思路:通过双栈不停出入栈,实现队列的功能。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

最小栈

  • 介绍:除了栈本身的功能,还需要提供每次获取最小元素的功能。要求所有操作的时间复杂度是 O(1)。
  • 设计思路:自身建立一个最小栈,每次只存放最小的数。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

最小栈优化

  • 介绍:同上
  • 设计思路:优化点在于上述最小栈是额外占用了一个栈来做最小栈,此处将该最小栈优化为一个数,节省了空间复杂度。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

单调栈

  • 介绍:将已知数组转化为这样一个数组:对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。
  • 设计思路:新建一个栈,若存在这样的数,则存入栈中。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

计算器

  • 介绍:实现一个可以满足基本运算的计算器(支持小数)
  • 设计思路:中缀表达式转后缀表达式。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

队列


  • 队列的基本功能包括:1、元素入队(offer),2、元素出队(poll),3、弹出队首元素(peek),4、队列判空(empty),5、获取真实队列长度(getrealsize),6、获取最大队列长度(getmaxsize),7、队列扩容(resize),8、查找函数(search)

数组队列【循环队列】

  • 介绍:使用数组做成一个循环队列
  • 设计思路:需要注意循环队列的扩容条件
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

链表队列

  • 介绍:使用链表建立队列
  • 设计思路:
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例

队列实现栈

  • 介绍:使用两个队列实现栈的功能。
  • 设计思路:通过两个队列来回置换原素,达到栈的功能。
  • 代码实现:为简便起见,主要实现代码和注释,都在下方的源码中有,不再赘述,测试用例如需补充,欢迎提commit和issue。
  • 源码和测试案例
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值