第五关|队列与栈的互相实现

1、栈实现队列

leetcode232

void push(int x) 将元素 x 推到队列的末尾

int pop() 从队列的开头移除并返回元素

int peek() 返回队列开头的元素

boolean empty() 如果队列为空,返回 true ;否则,返回 false

两栈:输入栈和输出栈。

push():进输入栈。

pop():将输入栈输入的元素一次性倒进输出栈,再pop()即可实现队列的出。倒进时要全部进,不然顺序会混乱。

public class MyQueue {

    Deque<Integer> stackIn;
    Deque<Integer> stackOut;

    public MyQueue(){
        stackIn = new LinkedList<>();
        stackOut = new LinkedList<>();
    }

    public void push(int x){
        stackIn.push(x);
    }

    public int pop(){
        if(stackOut.isEmpty()){
            dumpStackIn();
        }
        return stackOut.pop();
    }

    public int peek(){
        if(stackOut.isEmpty()){
            dumpStackIn();
        }
        return stackOut.peek();
    }

    public boolean empty(){
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    public void dumpStackIn(){
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

2、队列实现栈

1、只用1个队列实现

leetcode225

主要是模拟出栈:把队列size-1个出队再入队,就可以让真正该出的元素出去,模拟出栈。

public class MyStack {

    Queue<Integer> queue;

    public MyStack(){
        queue = new LinkedList<>();
    }

    public void push(int x){
        queue.add(x);
    }

    public boolean empty(){
        return queue.isEmpty();
    }

    public int pop(){
        repositon();
        return queue.poll();
    }

    //栈:123,321
    //队列:123,换顺序,312,因为模拟不出栈,所以取值后要复原,123
    //换位后,如果直接return queue.peek(),则没有复原,顺序变为312,下一次进行相关操作,开始顺 序就错了
    public int top(){
        repositon();
        int res = queue.poll();
        queue.add(res);
        return res;
    }

    public void repositon(){
        int size = queue.size();
        size--;

        while(size-- > 0){
            queue.add(queue.poll());
        }
    }
}

2、用2个队列

入栈操作时,首先将元素入队到 queue2,然后将 queue1的全部元素依次出队并入队到queue2,此时 queue2的前端的元素即为新入栈的元素,再将 queue1和queue2互换,则 queue1的元素即为栈内的元素,queue 1的前端和后端分别对应栈顶和栈底。

queue1,作为真正存数据的;queue2,作为辅助队列

public class MyStack2 {

    Queue<Integer> queue1;
    Queue<Integer> queue2;

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

    public void push(int x){
        queue2.offer(x);
        while(!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop(){
        return queue1.poll();
    }

    public int top(){
        return queue1.peek();
    }

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值