【数据结构】栈和队列的相互实现

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

1.用栈实现队列

 

当队列中进入这些元素时,相应的栈1中元素出栈顺序与出队列相反,因此我们可以使用两个栈来使元素的出栈顺序相同;

通过将栈1元素出栈,再入栈栈2,此时出队列的顺序和出栈2的顺序相同,基于这个原理,我们开始实现代码:

import java.util.ArrayDeque;

public class MyQueueUsStack {
    public ArrayDeque<Integer> s1;
    public ArrayDeque<Integer> s2;

    public MyQueueUsStack(){
        s1 = new ArrayDeque<>();
        s2 = new ArrayDeque<>();
    }

    // 入队操作,直接将元素压入第一个栈
    public void push(int x){
        s1.push(x);
    }

    public int pop(){
        if(empty()){
            return -1;
        }
        if(s2.isEmpty()){
            // 如果第二个栈为空,则将第一个栈中的元素全部转移到第二个栈
            while (!s1.isEmpty()){
                s2.push(s1.pop());
            }
        }
        return s2.pop();
    }

    public int peek(){
        if(empty()){
            return -1;
        }
        if(s2.isEmpty()){
            while (!s1.isEmpty()){
                s2.push(s1.pop());
            }
        }
        return s2.peek();
    }

    public boolean empty(){
        return s1.isEmpty() && s2.isEmpty();
    }
}

OJ:

 https://leetcode.cn/problems/implement-queue-using-stacks/description/

2.用队列实现栈

当前一共有N个元素,当需要出栈栈顶元素67时,先将队列1中前N-1个元素放入到队列2中:

 

每次出栈时,只需要将不为空的队列的前N-1个元素放入空队列中,此时队列中的元素即为要出栈的元素;

入栈时,将元素放入不为空的队列中;若两个队列都为空,则放入创建的第一个队列中;

import java.util.LinkedList;
import java.util.Queue;

public class MyStackUsQueue {
    public Queue<Integer> queue1;
    public Queue<Integer> queue2;

    public MyStackUsQueue(){
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    public void push(int x){
        if(empty()){
            queue1.offer(x);
            return;
        }
        if(!queue1.isEmpty()){
            queue1.offer(x);
        }else{
            queue2.offer(x);
        }
    }

    public int pop(){
        if(empty()){
            return -1;
        }
        if(!queue1.isEmpty()) {
            int size = queue1.size();
            for (int i = 0; i < size-1; i++) {
                queue2.offer(queue1.poll());
            }
            return queue1.poll();
        }else{
            int size = queue2.size();
            for (int i = 0; i < size-1; i++) {
                queue1.offer(queue2.poll());
            }
            return queue2.poll();
        }
    }

    public int peek(){
        if(empty()){
            return -1;
        }
        if(!queue1.isEmpty()) {
            int size = queue1.size();
            int ret = -1;
            for (int i = 0; i < size; i++) {
                ret = queue1.poll();
                queue2.offer(ret);
            }
            return ret;
        }else{
            int size = queue2.size();
            int ret = -1;
            for (int i = 0; i < size; i++) {
                ret = queue2.poll();
                queue1.offer(ret);
            }
            return ret;
        }
    }

    public boolean empty(){
        return queue1.isEmpty() && queue2.isEmpty();
    }
}

 OJ:

https://leetcode.cn/problems/implement-stack-using-queues/solutions/


希望这篇博客能为你理解java编程思想提供一些帮助。

如有不足之处请多多指出。

我是高耳机。 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值