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

大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html

先了解stack的方法有什么:
boolean empty():判断栈是否为空,如果栈为空则返回 true,否则返回 false。
E peek():查看栈顶元素,但不弹出。返回栈顶元素。
E pop():弹出栈顶元素并返回。从栈中移除并返回栈顶元素。
E push(E item):将元素推入栈顶。将元素压入栈顶。
int search(Object o):搜索元素在栈中的位置,返回距离栈顶最近的位置索引,如果元素不在栈中则返回 -1。

232. 用栈实现队列

class MyQueue {

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

    public MyQueue() {
        // 构造函数初始化两个栈
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        // 将元素推入 stackIn 栈,即入队操作
        stackIn.push(x);
    }
    
    public int pop() {
        // 执行出队操作,从 stackOut 栈中弹出元素
        // 如果 stackOut 栈为空,则先将 stackIn 栈中的元素转移到 stackOut 栈中
        dumpStackIn();
        return stackOut.pop();
    }
    
    public int peek() {
        // 返回队列的头部元素,即 stackOut 栈的栈顶元素
        // 如果 stackOut 栈为空,则先将 stackIn 栈中的元素转移到 stackOut 栈中
        dumpStackIn();
        return stackOut.peek();
    }
    
    public boolean empty() {
        // 判断队列是否为空,如果两个栈都为空,则队列为空
        return stackIn.isEmpty() && stackOut.isEmpty();
    }
    
    // 如果 stackOut 栈为空,那么将 stackIn 栈中的元素全部转移到 stackOut 栈中
    private void dumpStackIn() {
        if (!stackOut.isEmpty()) {
            return; // 如果 stackOut 栈不为空,则不需要转移元素
        }
        while (!stackIn.isEmpty()) {
            stackOut.push(stackIn.pop()); // 将 stackIn 栈中的元素逐个弹出并推入 stackOut 栈
        }
    }
}

225. 用队列实现栈

两个队列来实现栈的思路。

队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。

所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。

但是依然还是要用两个队列来模拟栈,只不过没有输入和输出的关系,而是另一个队列完全用来备份的!

先了解一下queue的方法:
Queue 接口是Java中表示队列的接口,它是一种先进先出(FIFO)的数据结构。以下是 Queue 接口中常见的方法:

boolean add(E e):将指定的元素插入队列尾部,如果成功则返回 true,如果队列已满则抛出异常。
boolean offer(E e):将指定的元素插入队列尾部,如果成功则返回 true,如果队列已满则返回 false。
E remove():移除并返回队列头部的元素,如果队列为空则抛出异常。
E poll():移除并返回队列头部的元素,如果队列为空则返回 null。
E element():返回队列头部的元素,如果队列为空则抛出异常。
E peek():返回队列头部的元素,如果队列为空则返回 null。
int size():返回队列中的元素个数。
boolean isEmpty():判断队列是否为空。
void clear():清空队列中的所有元素。
boolean contains(Object o):判断队列是否包含指定的元素。
Iterator iterator():返回一个迭代器,用于遍历队列中的元素。
这些方法提供了对队列的基本操作,包括添加元素、移除元素、获取元素、判断队列是否为空以及获取队列的大小等功能。

Queue 接口的常见实现类有 LinkedList、ArrayDeque 等。这些实现类提供了具体的队列实现,并实现了 Queue 接口中的方法。

class MyStack {
    Queue<Integer> queue1; // 用于保存栈中的元素
    Queue<Integer> queue2; // 辅助队列

    public MyStack() {
        // 构造函数初始化两个队列
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    public void push(int x) {
        // 将元素先放入辅助队列 queue2
        queue2.offer(x);
        // 将 queue1 中的元素依次放入 queue2
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        // 将 queue2 中的元素依次放入 queue1
         while (!queue2.isEmpty()) {
            queue1.offer(queue2.poll());
        }
        
-
    }

    public int pop() {
        // 弹出栈顶元素,即从 queue1 中出队一个元素
        return queue1.poll();
    }

    public int top() {
        // 返回栈顶元素,即查看 queue1 的队首元素
        return queue1.peek();
    }

    public boolean empty() {
        // 判断栈是否为空,即判断 queue1 是否为空
        return queue1.isEmpty();
    }
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值