算法|寻找不规律栈中最小元素

简介: 算法|寻找不规律栈中最小元素

问题描述

在之前的课程中,我们学习到了栈的知识。栈中的元素不可能都是像例题描述的一样规规矩矩的按顺序储存在栈中,在实际运用中,栈中的元素往往是杂乱、没有顺序的。出于实际的考虑,就需要我们去准确的定位栈中的元素。在本文章中,我们来探究探究怎么准确的定位栈中最小元素。

问题分析

在遇到寻找特定元素的问题时,很多人就会说,来设计个算法不就能解决了吗?何必还有深思其他方法去寻找。可当我们加上时间复杂度来思考后呢?不难发现鲜有排序和查找能够在很短的时间内解决这个问题。

解决方案

既然是一个栈不能解决的问题,我们何不再找个它的兄弟来帮忙。兄弟齐心,其利断金嘛。所以,我们试试看,双栈能不能解决这个问题。

我们都了解元素进出栈的规律,所以我们选择两个栈,其中一个用来储存数据,另外一个用来储存最小值。

我们可以发现,栈A中的元素是不规律的,入栈顺序是7、8、9、6、10,那么元素的出栈顺序就是10、6、9、8、7,在数据很少的情况下我们可以看出在栈A中要寻找的最小元素是6,但是在寻找之前我们并不知道栈A中的最小元素是何值,所以我们在另外一个栈中先任意储存一个值X。接下来,我们通过不断地push和pop操作来保持栈B中的栈顶元素一直为最小值。

  • 入栈

当有大于或等于X的值入栈A时,我们保持X为最小值不变,并将新元素压如栈A;当有小于X的值Y入栈A时,我们改变现在的最小值为Y,并将元素Y同时压入栈A和栈B。图示为当Y<X的情况。

  • 出栈

出栈时,栈A的元素与栈B的栈顶元素相比较,如果和栈B的栈顶元素一样,则栈B的栈顶元素也出栈。出栈的这个元素就是要寻找的最小元素。寻找最小元素的过程是不断地push和pop操作而得出的。


总结

双栈解决寻找最小元素的问题,其实就是进栈比大小,小则为min,同时压入,大则不压入储存栈;出栈时,相比较,同则同出,为min,反之不操作。解决该问题的思路还可以运用在寻找最大元素以及理想元素中,如果读者感兴趣,不妨亲自一试!


目录
相关文章
|
20天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
20天前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
21天前
|
算法
【C/数据结构和算法】:栈和队列
【C/数据结构和算法】:栈和队列
23 1
|
5天前
|
算法 Java 开发者
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
8 0
|
5天前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
7 0
|
14天前
|
算法
数据结构与算法:栈与队列
数据结构与算法:栈与队列
|
17天前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
14 0
|
20天前
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
20天前
|
算法
【数据结构与算法 刷题系列】移除链表元素
【数据结构与算法 刷题系列】移除链表元素
|
20天前
|
算法
【数据结构和算法】---栈和队列的互相实现
【数据结构和算法】---栈和队列的互相实现
10 0