栈和队列--一个同时存储最小值元素的栈
题目:设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
思路:在完成栈的构建时,可以考虑使用两个栈,一个栈用来保存栈最小的元素,一个栈用来完成正常的功能(这里仅涉及入栈和出栈的操作),
假设当前数据元素为data,先将其压入stackData,然后判断stackMin是否为空,如果stackMin为空,则将其也压入stackMin
如果不为空,则比较data与stack中的栈顶元素的大小,如果data更小,stackMin执行pop操作,将data执行push操作,反之,data丢掉;
这里代码中使用了现成的栈结构,我在之前的数据结构专栏中,也有记录基于Java实现的栈,也可将其拿过来用!!!这里主要介绍这个算法的思想,就不做过多的展示!!!
代码如下:
import java.util.Stack; public class MyStack1 { //构建两个stack,一个存储元素实现正常功能,一个记录最小元素 private Stack<Integer> stackData; private Stack<Integer> stackMin; //构造器,初始化 public MyStack1(){ this.stackData = new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } //压入数据 public void push(int newNUm){ //如果stackMin为空,将元素压入;如果data比stackMin中的小,将其压入 if(this.stackMin.isEmpty()){ this.stackMin.push(newNUm); }else if(newNUm <= this.getMin()){ this.stackMin.push(newNUm); } //同时将元素data压入stackData中 this.stackData.push(newNUm); } //弹出数据 public int pop(){ if(this.stackData.isEmpty()){ throw new RuntimeException("Your stack is empty!!!"); } //如果弹出元素与stackMin中的一样,则stackMin也要弹出该元素,保证stackMin中的元素一直是最小的 int value = this.stackData.pop(); if(value == this.getMin()){ this.stackMin.pop(); } return value; } public int getMin(){ if(this.stackMin.isEmpty()){ throw new RuntimeException("your stack is empyt!!!"); } return this.stackMin.peek(); } @Override public String toString() { return "栈中元素值为:" + stackData + " 其中最小值元素为:" + stackMin; } }
现在写一个主函数,演示一下效果:
public class GetMin { public static void main(String[] args){ MyStack1 myStack1 = new MyStack1(); myStack1.push(1); myStack1.push(3); myStack1.push(-1); myStack1.push(6); myStack1.push(7); myStack1.push(3); System.out.println(myStack1); } }
运行结果如下: