包含min函数的栈(求栈中最小的值)

问题

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。

分析

思路一

//方法1:
//可以定义一个额外的min保存栈中的最小值,但是每次插入,取出栈中最小值的时候都需要维护这个最小值

思路二

//方法2:
//可以定义一个两个栈
//栈A:存放数据
//栈B:存放栈A中当前元素的最小值,当栈A中的栈顶元素出栈时,则判断
// 当栈A中有元素进栈的时候,同样判断,若入栈的元素小于栈B的栈顶元素,则将该元素页压入栈B
在这里插入图片描述

代码

package DlinkedList;

import ATree.Problem6;

import java.util.ArrayList;
import java.util.Stack;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/3/21 0021  16:09
 * 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数
 * (时间复杂度应为O(1))。
    注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
 */
public class Problem7 {

    //方法1:
    //可以定义一个额外的min保存栈中的最小值,但是每次插入,取出栈中最小值的时候都需要维护这个最小值

    //方法2:
    //可以定义一个两个栈
    //栈A:存放数据
    //栈B:存放栈A中当前元素的最小值,当栈A中的栈顶元素出栈时,则判断
                        //     当栈A中有元素进栈的时候,同样判断,若入栈的元素小于栈B的栈顶元素,则将该元素页压入栈B



    Stack<Integer> A=new Stack<>();
    Stack<Integer> B=new Stack<>();

    public void push(int node) {
        //若栈为空
        if(A.size()==0){
            A.push(node);
            B.push(node);
        }else{
            //假如压栈的元素小于栈B顶的元素则页压入到栈B中
            A.push(node);
            if(node<B.peek()){
                B.push(node);
            }

        }

    }

    public void pop() {
        //假如当前出栈的元素就是最小元素,则页应从栈B中出栈
        if(top()==B.peek()){
            B.pop();
        }
        A.pop();
    }

    //查看栈顶元素
    public int top() {
        return A.peek();
    }

    public int min() {
        //返回栈B的栈顶元素即可
        return B.peek();
    }

    public static void main(String[] args) {
        Problem7 problem7 = new Problem7();
        problem7.push(20);
        problem7.push(12);
        problem7.push(15);
        problem7.push(2);
        problem7.push(33);
        problem7.pop();
        problem7.pop();
        problem7.pop();

        System.out.println(problem7.min());




    }
}


发布了198 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ZHOUJIAN_TANK/article/details/105012621