包含min函数的栈

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

分析
借用一个辅助栈来把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)保存起来,这样在弹出最小元素之后,可以获得下一个最小元素。
比如现在一次向栈中压入3, 4, 2, 1之后在连续两次弹出栈顶数字在压入0:

步骤 操作 数据栈 辅助栈 最小值
1 压入3 3 3 3
2 压入4 3,4 3,3 3
3 压入2 3,4,2 3,3,2 2
4 压入1 3,4,2,1 3,3,2,1 1
5 弹出 3,4,2 3,3,2 2
6 弹出 3,4 3,3 3
7 压入0 3,4,0 3,3,0 0

代码:

import java.util.Stack;

public class Solution {

	Stack dataStack = new Stack();
	Stack minStack = new Stack();
	
    public void push(int node) {
        dataStack.push(node);
        
        if(minStack.empty() || node < (int)minStack.peek()) {
        	minStack.push(node);
        }
        else {
        	minStack.push(top());
        }
    }
    
    public void pop() {
        if(!dataStack.isEmpty() && !minStack.isEmpty()) {
        	dataStack.pop();
        	minStack.pop();
        }
    }
    
    public int top() {
        return (int) minStack.peek();
    }
    
    public int min() {
    	
    	if(!dataStack.isEmpty() && !minStack.isEmpty()) {
    		return top();
    	}else {
    		return (Integer) null;
    	}
    }
    
    //测试代码
    public static void main(String[] args) {
    	Solution s = new Solution();
    	s.push(3);
    	System.out.println(s.min());
    	s.push(4);
    	System.out.println(s.min());
    	s.push(2);
    	System.out.println(s.min());
    	s.push(1);
    	System.out.println(s.min());
    	s.pop();
    	System.out.println(s.min());
    	s.pop();
    	System.out.println(s.min());
    	s.push(0);
    	System.out.println(s.min());
	}
}
posted @ 2019-03-22 14:10  如是说  阅读(203)  评论(0编辑  收藏  举报