代码随想录算法训练营day10 | 232.用栈实现队列, 225. 用队列实现栈


栈与队列基础

stack

在这里插入图片描述

Queue(单向队列)

LinkedList 实现了 Queue 接口,可作为队列使用。
在这里插入图片描述


Deque(双端队列接口,既可以当作队列用也可以当作栈用)

LinkedList 实现了 Deque 接口,可作为双端队列使用。
在这里插入图片描述

Java双端队列Deque使用详解

1.普通队列:

Deque接口扩展(继承)了 Queue 接口。
在这里插入图片描述

2.双端队列:

在这里插入图片描述

3.栈:

在这里插入图片描述


232.用栈实现队列

教程视频:https://www.bilibili.com/video/BV1nY4y1w7VC
在这里插入图片描述在这里插入图片描述

解法

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        if(stackOut.isEmpty()){
            while(!stackIn.isEmpty()){
                stackOut.push(stackIn.pop());
            }
        }

        return stackOut.pop();
    }
    
    public int peek() {
        //一个空的队列不会调用 pop 或者 peek 操作

        //如果out栈有元素,先弹出返回再压入
        if(stackOut.isEmpty()){
            while(!stackIn.isEmpty()){
                stackOut.push(stackIn.pop());
            }
        }
        int temp = stackOut.pop();
        stackOut.push(temp);
        return temp;
    }
    
    public boolean empty() {
        return (stackIn.isEmpty() && stackOut.isEmpty());
    }
}

225. 用队列实现栈

教程视频:https://www.bilibili.com/video/BV1Fd4y1K7sm
在这里插入图片描述在这里插入图片描述

解法一:用一个单向队列实现

每次压入新元素都调整到即将出队的位置,使其中元素保持为堆栈顺序

class MyStack {
    Queue<Integer> q1;
   
    public MyStack() {
        q1 = new LinkedList<Integer>(); 
    }
    
    public void push(int x) {
        q1.offer(x);
        int size = q1.size();
        size--;
        while(size!=0){
            q1.offer(q1.poll());
            size--;
        }
    }
    
    public int pop() {
        return q1.poll();
    }
    
    public int top() {
        return q1.peek();
    }
    
    public boolean empty() {
        return q1.isEmpty();
    }
}

解法二:用一个双向队列实现

从头部插入从头部弹出

class MyStack {
    Queue<Integer> q1;
   
    public MyStack() {
        q1 = new LinkedList<Integer>(); 
    }
    
    public void push(int x) {
        q1.offer(x);
        int size = q1.size();
        size--;
        while(size!=0){
            q1.offer(q1.poll());
            size--;
        }
    }
    
    public int pop() {
        return q1.poll();
    }
    
    public int top() {
        return q1.peek();
    }
    
    public boolean empty() {
        return q1.isEmpty();
    }
}

总结

Stack基础操作

操作方法
压入元素push(x)
弹出元素pop()
查看顶部元素peek()
判断是否为空empty() / isEmpty()

Queue基础操作

操作方法
压入元素offer(x)
弹出元素poll()
查看顶部元素peek()
判断是否为空isEmpty()

Deque基础操作

操作方法操作方法
头部压入元素offerFirst(x)尾部压入元素offerLast(x)
头部弹出元素pollFirst()尾部弹出元素pollLast()
查看 头部元素peekFirst()查看尾部元素peekLast()
判断是否为空isEmpty()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值