这里就体现出刷题的好处了,刷的多了就会遇到重复的题目。

思路有了之后便是逻辑编码 再就可以迎刃而解了。

本题收录在 《程序员代码面试指南》的第一题。
我是用的是 两个栈,[一个只存最小值(值唯一),一个存原值] 的省空间方法。
还有[维护高度相同的两个栈,一个存原值,一个存最小值] 的省时间方法。

public class Solution {

    Stack<Integer> stack = new Stack<>();
    Stack<Integer> mainStack = new Stack<>();


    public void push(int node) {
        stack.push(node);
        if(mainStack.isEmpty()){
            mainStack.push(node);
        } else  if(node <= mainStack.peek()){
            mainStack.push(node);
        }
    }

    public void pop() {
        int popNode=stack.pop();
        if(popNode == mainStack.peek()){
            mainStack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int min() {
        return mainStack.peek();
    }
}

栈的常用API

栈又称堆栈

boolean empty() 

测试堆栈是否为空。

Object peek( )

查看堆栈顶部的对象,但不从堆栈中移除它。

Object pop( )

移除堆栈顶部的对象,并作为此函数的值返回该对象。

Object push(Object element)

把项压入堆栈顶部。

int search(Object element)

返回对象在堆栈中的位置,以 1 为基数。