My Twentieth Page - 用栈实现队列 - By Nicolas

这篇page是针对leetcode上的232.用栈实现队列这道题所写的,小尼先简单的说明一下这道题,就是利用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)。小尼首先说明一下栈的特点栈的特点是先入后出,队列的特点是先入先出。接下来小尼会讲解两种思路。上一下图:

大家可以先看看上面小尼写的思路啊,然后小尼再给各位实现一下它的各个功能:

public void push(int x){
    if(s1.empty())
        front = x;//此处的front是用来记录首节点的
    while(!s1.isEmpty())
        s2.push(s1.pop());
    s2.push(x);
    while(!s2.isEmpty())
        s1.push(s2.pop());
}

首先上面实现的push的功能,其实也就将小尼说的两个栈的好好利用实现了队列的功能,这里的写的方法和小尼上面图中所说的有一个地方不同,希望大家可以注意一下,小尼上面说先将s1的元素放入s2中,然后再把我们新入的元素放入s1中,再将s2中的元素放入回来,但是小尼上面写的代码是再将s1的元素放入之后直接就把新入的元素直接放到s2的最上面然后再将s2的元素放入s1中,但是区别不大。好,小尼继续写其他的方法的实现:

public void pop(){
    s1.pop();
    if(!s1.isEmpty())
        front = s1.peek();
}
public boolean empty(){
    return s1.isEmpty();
}
public int peek(){
    return front;
}

好的,小尼接下来说明一下第二种实现的方法,小尼先上一张图:

 

 接下来小尼对着这个方法拉一下代码:

class MyQueue{
    Deque<Integer> s1;
    Deque<Integer> s2;
    
    public void MyQueue(){
        s1 = new ArrayDeque<Integer>();
        s2 = new ArrayDeque<Integer>();
    }
    
    public void push(x){
        s1.push(x);
    }
    
    public int pop(){
        if(s2.isEmpty()){
            change();
        }
    }
    
    public boolean empty(){
        return s1.isEmpty() && s2.isEmpty();
    }
    
    public void change(){
        while(!s1.isEmpty()){
            s2.push(s1.pop());
        }
    }
}

上述代码可以实现两个栈完成队列的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值