代码随想录-算法训练营day10【栈与队列01:理论基础、用栈实现队列、用队列实现栈】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客

bash 复制代码
 第五章 栈与队列part01
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY  
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG  
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6 
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp 
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4 
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj 
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH 
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4 

今日任务:
● 理论基础
● 232.用栈实现队列
● 225. 用队列实现栈
理论基础 

了解一下 栈与队列的内部实现机智,文中是以C++为例讲解的。 

文章讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html   

 232.用栈实现队列 

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

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

  225. 用队列实现栈 

可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。 

建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解

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

目录

理论基础

1、栈(Stack)

2、队列(Queue)

0232_用栈实现队列

0225_用队列实现栈


理论基础

栈(Stack)和队列(Queue)是两种常见的数据结构,它们在 Java 中都有对应的类和接口,并且都有一些常用的函数或方法。以下是它们的常用函数或方法:

1、栈(Stack)

在 Java 中,栈的常用函数和方法包括:

  1. push(E item): 将元素压入栈顶。
  2. pop(): 弹出栈顶元素并返回。
  3. peek(): 返回栈顶元素但不移除。
  4. empty(): 判断栈是否为空。
  5. search(Object o): 查找指定元素在栈中的位置,从栈顶开始计数,返回距离栈顶最近的位置。

Java 中的栈类是 java.util.Stack,它是 Vector 类的一个子类,使用它可以实现栈的基本功能。

2、队列(Queue)

在 Java 中,队列的常用函数和方法包括:

  1. add(E e)offer(E e): 向队尾添加一个元素。
  2. remove()poll(): 移除并返回队列头部的元素。
  3. element()peek(): 返回队列头部的元素但不移除。
  4. isEmpty(): 判断队列是否为空。
  5. size(): 返回队列中的元素个数。
  6. clear(): 清空队列。

Java 中的队列接口有多个实现类,最常见的是 java.util.LinkedList(链表实现的队列)和 java.util.ArrayDeque(数组实现的队列),它们都实现了 Queue 接口。

需要注意的是,Stack 类和 Vector 类以及它们的方法在 Java 中被认为是不推荐使用的,因为它们的同步操作可能导致性能下降。推荐使用 ArrayDequeLinkedList 作为栈和队列的实现。

0232_用栈实现队列

java 复制代码
import java.util.Stack;

class MyQueue {
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    /**
     * Initialize your data structure here.
     */
    public MyQueue() {
        stackIn = new Stack<>();  //负责进栈
        stackOut = new Stack<>(); //负责出栈
    }

    /**
     * Push element x to the back of queue.
     */
    public void push(int x) {
        stackIn.push(x);
    }

    /**
     * Removes the element from in front of queue and returns that element.
     */
    public int pop() {
        dumpstackIn();
        return stackOut.pop();
    }

    /**
     * Get the front element.
     */
    public int peek() {
        dumpstackIn();
        return stackOut.peek();
    }

    /**
     * Returns whether the queue is empty.
     */
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    //如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
    private void dumpstackIn() {
        if (!stackOut.isEmpty()) return;
        while (!stackIn.isEmpty()) {
            stackOut.push(stackIn.pop());
        }
    }
}

0225_用队列实现栈

java 复制代码
import java.util.LinkedList;
import java.util.Queue;

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */
class MyStack225 {
    Queue<Integer> q;

    public void MyStack225() {
        q = new LinkedList<>();
    }

    //将元素x压入栈顶。
    public void push(int x) {
        q.offer(x);
        int size = q.size();
        //q.add(x);
        while (size > 0) {
            q.offer(q.poll());
            size--;
        }
    }

    //移除并返回栈顶元素。
    public int pop() {
        return q.poll();
    }

    //返回栈顶元素。
    public int top() {
        return q.peek();
    }

    //如果栈是空的,返回true;否则,返回false。
    public boolean empty() {
        return q.isEmpty();
    }
}
相关推荐
卡尔特斯6 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源6 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole6 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫6 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide7 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261357 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源7 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub8 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群8 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心8 小时前
从零开始学Flink:数据源
java·大数据·后端·flink