算法面试题:设计一个getMin功能的栈(java)

【说明】:本文来自左程云老师所著的《程序员面试代码指南》第一章中“设计一个有getMin功能的栈”

【题目】:

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

【要求】:

  1、pop、push、getMin操作的时间复杂度都是O(1)。

  2、设计的栈类型可以使用现成的栈结构。

【思路】:

  一、需要两个栈,一个用来存放数据:dataStack,另一个用来存放最小值:minStack。

  1. 首先需要判断dataStack是否为空,如果为空,两个栈存入数据
  2. 当dataStack不为空时,拿到minStack栈顶的数据和传入的数据进行比较,谁小谁存进minStack

  如此一来,minStack栈顶的值便是这组数据的最小值

import java.util.Stack;

/**
 * @ClassName SpecialStack
 * @Description 特殊功能的栈-----在实现栈的基本功能外,能够取得栈中的最小值
 * @Author Huarray
 * @Date 2019/1/7 10:37
 * @Version 1.0
 **/
public class SpecialStack {
    //用来存贮数据
    private Stack dataStack;

    //用来存贮栈中最小值
    private Stack minStack;

    public SpecialStack(){
        this.dataStack = new Stack();
        this.minStack = new Stack();
    }

    /**
     * @Author Huarray
     * @Description 入栈
     * @Date 10:41 2019/1/7
     * @Param [iteam]
     * @return void
     **/
    public void push(int iteam){
        //如果栈为空,那么直接把数据存入栈中
        if (dataStack.isEmpty()){
            dataStack.push(iteam);
            minStack.push(iteam);
        }else {
            dataStack.push(iteam);
            if (iteam < (Integer) minStack.peek()){
                minStack.push(iteam);
            }else {
                minStack.push(minStack.peek());
            }
        }
    }

    /**
     * @Author Huarray
     * @Description 弹栈
     * @Date 11:43 2019/1/7
     * @Param []
     * @return int
     **/
    public int pop(){
        if(dataStack.isEmpty()){
            throw new RuntimeException("栈已经为空!");
        }
        int num = (Integer) this.dataStack.pop();
        if (num == this.getMin()){
            minStack.pop();
        }
        return num;
    }

    /**
     * @Author Huarray
     * @Description 获取最小值
     * @Date 13:20 2019/1/7
     * @Param []
     * @return int
     **/
    public int getMin(){
        if (this.minStack.isEmpty()){
            throw new RuntimeException("栈为空");
        }
        return (Integer) minStack.peek();
    }
}

测试类

/**
 * @ClassName Test
 * @Description TODO
 * @Author Huarray
 * @Date 2019/1/7 13:22
 * @Version 1.0
 **/
public class Test {

    public static void main(String[] ages){
        SpecialStack specialStack = new SpecialStack();
        int[] arr = {5,7,6,1,2,3,8};
        for (int i = 0; i < arr.length;i++){
            specialStack.push(arr[i]);
        }
//        System.out.println(specialStack.pop());
        System.out.println("最小值:" + specialStack.getMin());
    }
}

 结果

 如有疑问欢迎评论,初学,一起共勉

 

你可能感兴趣的:(算法)