练题001

两个栈实现队列。

分析:队列是先进先出,栈是先进后出。

先无论怎样实现都需要将数据先存储起来,所以对一个栈进行压栈

出栈或者说出队列的实现,先进先出就必须将栈存储的数据倒过来才能通过栈实现,那么很明显要将stack1的数据弹栈到stack2中实现数据倒置

 倒置弹栈很容易就是实现了数据的先进先出,但是我们需要考虑到数据事先存不存在以及两个栈空栈情况。

1)stack1空栈,stack2空栈 ,那么说明没有数据,队列没有数据。可返回-1

2)stack1有数据,stack2空栈(要么之前的数据出完,要么是第一次调用出列方法),这种情况就将stack1 的所有数据转移到stack2,对stack2进行弹栈就实现了出队列

3)stack1有数据,stack2也有数据(说明上次的出队列stack1的数据全部转移到2中没有出完),那么为了实现先入先出,就必须将他们出完,那么就直接弹栈stack2实现出队列

4)stack1无数据,stack2有数据,和第三种情况一样,直接弹栈出队列。

总而言之是要注意对栈空的判断。

队列进队列就直接对stack1压栈就实现了

队列出队列:首先考虑stack2的空栈情况,因为一旦stack2 存在数据,那么要实现先入先出就必须stack2弹栈完全;其次考虑stack1的空栈情况,它的直接影响是整个队列空的情况。

class CQueue {

    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    public CQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void appendTail(int value) {
        stack1.push(value);
    }
    
    public int deleteHead() {
        if (stack2.empty()){
            if (stack1.empty()) return -1;
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }    
        return stack2.pop();
    }
}

附带stack数据结构java的API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值