数据结构--栈

这篇博客介绍了如何利用两个栈来分别实现带有最小值功能的栈以及队列的数据结构。在最小值栈中,通过stackMin栈只存储小于当前栈顶元素的最小值,确保快速获取最小值。而在两个栈实现的队列中,stackPush用于入队,stackPop则在出队时将stackPush的所有元素转移到stackPop,从而模拟队列的FIFO特性。
摘要由CSDN通过智能技术生成

通过两个栈,实现添加数据后,取出最小值

/**
 * 通过两个栈,实现添加数据后,取出最小值
 * 大概思路,stackMin栈入栈规则,只有当压入的数值比该栈顶元素小时才入栈。另一个栈存放所有压入的数据。
 */
public class MyStack1 {
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    /**
     * 构造方法初始化属性值,这一步必须初始化,否则会报空指针异常
     */
    public MyStack1(){
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }
    /**
     * 入栈
     * @param newNum
     */
    public void pushStack(int newNum){
        if (stackMin.isEmpty()){
            stackMin.push(newNum);
        }else if (newNum <= stackMin.peek()){
            stackMin.push(newNum);
        }
        stackData.push(newNum);
    }

    /**
     * 出栈
     */
    public Integer popStack(){
        if (stackMin.isEmpty()){
            throw new RuntimeException("yun");
        }
        Integer value = stackData.pop();
        if (value == stackMin.peek()){
            return value;
        }
        return 0;
    }

    /**
     * 取出栈中的最小值
     * @return
     */
    public Integer getMinNum(){
        return stackMin.peek();
    }
}

两个栈实现一个队列

/**
 * 两个栈实现一个队列;队列的基本功能:add poll peek
 * stackPush向stackPop压入元素的时候,必须一次性压完,而且stackPop必须为空
 */
public class TwoStackQueue {
    private Stack<Integer> stackPush;
    private Stack<Integer> stackPop;

    public TwoStackQueue(){
        this.stackPush = new Stack<Integer>();
        this.stackPop = new Stack<Integer>();
    }
    private void pushtoPop(){
        if (stackPop.isEmpty()){
            while (!stackPush.isEmpty()){
                stackPop.push(stackPush.pop());
            }
        }
    }

    public void add(int newNum){
        stackPush.push(newNum);
        pushtoPop();
    }

    public Integer poll(){
        pushtoPop();
        return stackPop.pop();
    }

    public int peek(){
        pushtoPop();
        return stackPop.peek();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值