栈和队列--一个同时存储最小值元素的栈

题目:设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

思路:在完成栈的构建时,可以考虑使用两个栈,一个栈用来保存栈最小的元素,一个栈用来完成正常的功能(这里仅涉及入栈和出栈的操作),

假设当前数据元素为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);

    }
}

运行结果如下:

 

posted @ 2022-11-30 01:32  99号的格调  阅读(22)  评论(0编辑  收藏  举报