代码随想录-算法训练营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();
    }
}
相关推荐
百事老饼干4 分钟前
Java[面试题]-真实面试
java·开发语言·面试
customer0811 分钟前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_8575893621 分钟前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
HBryce2425 分钟前
缓存-基础概念
java·缓存
一只爱打拳的程序猿40 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
幸运超级加倍~40 分钟前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
杨荧41 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck43 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划