代码随想录-算法训练营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();
    }
}
相关推荐
喵叔哟7 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生13 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
不是二师兄的八戒37 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶2 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea