最小栈

题目描述

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) – 将元素 x 推入栈中。
  • pop() – 删除栈顶的元素。
  • top() – 获取栈顶元素。
  • getMin() – 检索栈中的最小元素。

示例

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

题解

在自定义的栈类中,声明两个栈成员变量stackData和stackMin。stackData用于存储当前栈中的元素;stackMin用于保存当前栈中元素的最小值。
方法一:
压入数据规则:令压入数据为x,直接压入到stackData中。然后判断stackMin是否为空,若stackMin为空则压入x,若不为空,则比较x和stackMin中栈顶元素的大小,若x小于等于stackMin.peek()则压入stackMin中,否则不压入。所以stackData中的元素是从栈底到栈顶依次减小的。
弹出数据规则:弹出stackData中的栈顶元素记为x,比较x和stackMin中栈顶元素是否相等,若相等则弹出stackMin中栈顶元素,否则不弹出。
后来压入到stackMin中的元素在弹出时会较之前的先弹出,所以不会存在元素已经弹出stackMin中还存在该元素的情况。

public class MinStack {
    private Stack<Integer> stackData;
	private Stack<Integer> stackMin;
    /** initialize your data structure here. */
    public MinStack() {
        stackData=new Stack<>();
		stackMin=new Stack<>();
        
    }
    public void push(int x) {
       stackData.push(x);
       if(stackMin.isEmpty())
    	   stackMin.push(x);
       else {
    	   if(stackMin.peek()>=x)
    		   stackMin.push(x);
       }
    } 
    public void pop() {
         if(!stackData.isEmpty()) {
        	 int x=stackData.pop();
        	 if(x==stackMin.peek())
        		 stackMin.pop();
         }
    }
    public int top()  {
        if(!stackData.isEmpty()) {
        	return stackData.peek();
        }
        return -1;
    }
    public int getMin() {
        if(stackMin.isEmpty())
			 return -1;
		return stackMin.peek();	 
    }
 }

方法二:
压入数据规则:令压入数据为x,直接压入到stackData中。压入数据规则:令压入数据为x,直接压入到stackData中。然后判断stackMin是否为空,若stackMin为空则压入x,若不为空,则比较x和stackMin中栈顶元素的大小,若x小于等于stackMin.peek()则压入stackMin中,否则将stackMin中的栈顶元素重复压入。
弹出数据规则:弹出StackData中栈顶元素同时也弹出stackMin中的元素。

public class MinStack2 {
	private Stack<Integer> stackData;
	private Stack<Integer> stackMin;
	public MinStack2() {
		stackData=new Stack<>();
		stackMin=new Stack<>();
	}
	public void push(int x) {
		stackData.push(x);
		if(stackMin.isEmpty())
			stackMin.push(x);
		else {
			if(stackMin.peek()>x)
				stackMin.push(x);
			else
				stackMin.push(stackMin.peek());
		}
	}
	public void pop() {
		if(!stackData.isEmpty()) {
			stackData.pop();
			stackMin.pop();
		}
	}
	public int top() {
        if(!stackData.isEmpty())
        	return stackData.peek();
        return -1;
    }    
    public int getMin() {
        if(!stackMin.isEmpty())
        	return stackMin.peek();
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值