设计一个能够获取栈中最小值的栈。

设计一个栈

要求:支持 push,pop,top 操作,并能在常数时间内检索到栈中最小元素。

示例

public Stack<Integer> stackMin = new Stack<Integer>();
stackMin.push(-3);
stackMin.push(10);
stackMin.push(-32);
stackMin.getMin();-->返回-32
stackMin.pop();
stackMin.top();
stackMin.getMin();-->返回-3

思路

使用两个栈,一个普通栈,一个记录最小数的辅助栈。

代码实现

public class TwoStack{
	//申请两个栈,一个普通栈stackData,
	//一个能获取最小值的栈stackMin(从栈底到栈顶依次减小的栈)
	public Stack<Integer> stackData;
    public Stack<Integer> stackMin;
	//初始化两个栈
    public TwoStack() {
        stackData = new Stack<Integer>();
        stackMin = new Stack<Integer>();
    }
	//两个栈各自的push方法,为了和栈的方法push区别开命名ppush
    public void ppush(int newNum){
		//stackData的push,直接将数压栈
        stackData.push(newNum);
		//判断最小栈是否有数,没有的话直接将数压栈
        if(stackMin.isEmpty()){
            stackMin.push(newNum);
		//当普通栈的数小于最小栈的数,直接将数压栈
		//比较的是每次要入栈的数和最小栈的栈顶元素
        }else if(newNum < this.getmin()){
            stackMin.push(newNum);
        }else{
		//若普通栈的数大于等于最小栈的数,将最小栈的栈顶元素再压一次进栈,
		//Stack的peek方法是返回栈顶的元素但不移除它
            int newMin = stackMin.peek();
            stackMin.push(newMin);
        }
    }
	//两个栈各自的pop方法,为了和栈的方法pop区别开命名ppop
    public int ppop(){
        if(stackData.isEmpty()){
            throw new RuntimeException("普通栈空了");
        }
        stackMin.pop();
        return stackData.pop();
    }
	//获取最小值的方法,本质就是返回最小值栈的栈顶
    private int getmin() {
        if(stackMin.isEmpty()){
            throw new RuntimeException("最小数栈空了");
        }
        return stackMin.peek();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值