【题目】定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求时间复杂度是O(1)。push pop min
【思路】设计一个辅助栈,当新加入的原数据栈中的数小于辅助栈顶的数时就加入该数,大于就继续加入辅助栈顶的数。这样想取出最小数就直接取出辅助栈栈顶的数就可以。
1 package com.exe4.offer; 2 3 import java.util.Stack; 4 5 /** 6 * 18【题目】定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求时间复杂度是O(1)。 7 * @author WGS 8 * 9 */ 10 public class MinInStack { 11 12 Stack<Integer> dataStack=new Stack<Integer>();//数据栈 13 Stack<Integer> assisstStack=new Stack<Integer>();//辅助栈 14 15 //压入操作 保证最小的数放在栈顶,所以原数据栈压入一个数时,辅助栈要比较该数与上个数的大小,》则仍压入上个数 16 //小,则压入该数 17 public void push(int node){ 18 dataStack.push(node); 19 if(assisstStack.size()==0 || node<assisstStack.peek()){//新压入的数node小,就压入node 20 assisstStack.push(node); 21 }else{ 22 assisstStack.push(assisstStack.peek());//否则压入assisstStack中最小的数 23 } 24 } 25 26 public void pop(){ 27 if(dataStack.size()>0 && assisstStack.size()>0){ 28 dataStack.pop(); 29 assisstStack.pop(); 30 } 31 } 32 //元数据栈顶值 33 public int top(){ 34 if(dataStack.size()>0){ 35 return dataStack.peek(); 36 } 37 return -1; 38 } 39 //辅助栈中最小值 40 public int min(){ 41 if(dataStack.size()>0 && assisstStack.size()>0){ 42 return assisstStack.peek(); 43 } 44 return -1; 45 46 } 47 public static void main(String[] args) { 48 MinInStack minStack=new MinInStack(); 49 minStack.push(1); 50 //minStack.pop(); 51 minStack.push(4); 52 minStack.push(2); 53 minStack.push(11); 54 55 System.out.println(minStack.min());//1 辅助栈中最小值 56 System.out.println(minStack.top());//11 元数据栈中栈顶值 57 58 } 59 60 }