《剑指Offer》第20题(Java实现):定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

一、题目描述

  定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

二、思路解析

  首先定义一个Integer类型的栈,记为stack,此栈用来完成数据正常的push()、pop()、top()和peek()等操作。
  然后定义一个Integer类型的栈,记为minStack(一定要理解清楚此栈的作用),此栈主要用来记录每一次stack进行push、pop、top和peek等操作后stack栈中的最小元素,所以stack的每一次push或者pop操作后,都需要对minStack进行更新处理,以保证minStack能够及时记录stack当前元素中的最小值(stack和minStack需要进行同步操作,也即stack有元素入栈时候,minStack也要入栈一个特殊的元素(以更新stack中新的最小值);stack出栈时候,minStack也要出栈(以更新记录stack中新的最小值))。简单说,minStack就是实时记录stack中最小元素值,为了保证实时记录的任务,minStack对于stack的push和pop操作需要作出相应的操作。

  1、stack入栈时候,minStack需要进行的操作

    (1)如果入栈元素node比minStack栈顶元素小(此处没有讨论stack为空的情况,如果stack为空,则stack和minStack都入栈node元素)
      则在stack入栈后,把入栈元素node也加入到minStack栈顶(保证minStack记录stack当前所有元素中的最小值)
    (2)如果入栈元素node比minStack栈顶元大
      此情况说明入栈node后stack中最小值没有变,最小值还是入栈前的最小值,所以node不应该加入到minStack的栈顶,但是minStack仍然需要入栈一个元素,这个元素的大小等于minStack的栈顶元素,如下代码中所示:“minStack.push(minStack.peek());”。这个比较容易忽略,其实只要想一想minStack的作用就很容易理解。

  2、stack出栈时候,minStack需要进行的操作

    stack出栈时,minStack也要出栈,以更新对stack最小值的记录。

  3、过程模拟

    (1)假设stack连续入栈元素为5,3,6,4,2,3,1,则minStack中先后入栈元素为5,3,3,3,2,2,1。
    (2)在(1)基础上,假设stack先后出栈1,3,2,则minStack先后出栈1,2,2。

三、java代码   

public class Solution {
Stack<Integer> stack = new Stack();
Stack<Integer> minStack = new Stack();

public void push(int node) {
if(stack.empty()){
stack.push(node);
minStack.push(node);
}else{
stack.push(node);
if(node < minStack.peek()){
minStack.push(node);
}else{
minStack.push(minStack.peek());
}
}
}

public void pop() {
stack.pop();
minStack.pop();
}

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

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

以上均为个人理解,如果不正确、不合理或者可以优化的地方,欢迎下方留言。 

上一篇:【OpenCV新手教程之十八】OpenCV仿射变换 & SURF特征点描写叙述合辑


下一篇:某校高中生利用Python,巧妙获取考试成绩,看到成绩后无言以对!