栈与队列面试题(Java数据结构)

news/2024/10/9 3:05:08 标签: java, 开发语言, 笔记, 前端, 数据结构

前言:

        这里举两个典型的例子,实际上该类型的面试题是不确定的!

用栈实现队列:

        232. 用栈实现队列 - 力扣(LeetCode)

方法一:双栈
思路

将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop 和 peek 操作。

每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。

java">class MyQueue {
    private Deque<Integer> st1;
    private Deque<Integer> st2;
    public MyQueue() {
        st1 = new ArrayDeque<>();
        st2 = new ArrayDeque<>();
    }
    
    public void push(int x) {
        st1.push(x);
    }
    
    public int pop() {
        if(st2.isEmpty()) {
            inout2();
        }
        return st2.pop();
    }

    public int peek() {
           if(st2.isEmpty()) {
            inout2();
        }
        return st2.peek();
    }
    
    public boolean empty() {
        if(st1.isEmpty() && st2.isEmpty()) {
            return true;
        }
        return false;
    }
    private void inout2() {
        while(!st1.isEmpty()) {
            st2.push(st1.pop());
        }
    }
}

用队列实现栈:

225. 用队列实现栈 - 力扣(LeetCode)

为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中 queue 1用于存储栈内的元素,queue 2作为入栈操作的辅助队列入栈操作时,首先将元素入队到 queue 2,

然后将 queue 1​的全部元素依次出队并入队到 queue 2,此时 queue 2的前端的元素即为新入栈的元素,再将 queue1和queue 2互换,则 queue1的元素即为栈内的元素,queue1 的前端和后端分别对应栈顶和栈底由于每次入栈操作都确保 queue 1的前端元素为栈顶元素,

因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 queue 1的前端元素并返回即可,获得栈顶元素操作只需要获得 queue 
1的前端元素并返回即可(不移除元素)。

java">class MyStack {
    private Queue<Integer> q1;
    private Queue<Integer> q2;
    public MyStack() {
        q1 = new LinkedList<>();
        q2 = new LinkedList<>();
    }
    
    public void push(int x) {
     q2.offer(x);
     while(!q1.isEmpty()){
        q2.offer(q1.poll());
     }
     Queue<Integer> tmp = q1;
     q1 = q2;
     q2 = tmp;
    }
    
    public int pop() {
     return q1.poll();
    }
    
    public int top() {
        return q1.peek();
    }
    
    public boolean empty() {
        if(q1.isEmpty() && q2.isEmpty()) {
            return true;
        }
        return false;
    }
}


http://www.niftyadmin.cn/n/5695175.html

相关文章

自动机器学习(AutoML):实战项目中的应用与实现

自动机器学习&#xff08;AutoML&#xff09;&#xff1a;实战项目中的应用与实现 目录 &#x1f50d; AutoML概念与实战意义&#x1f6e0;️ 使用TPOT进行模型选择与优化&#x1f5bc;️ 利用AutoKeras进行图像分类&#x1f4c8; 实际项目案例&#xff1a;金融数据预测&…

毒蘑菇检测数据集 9200张 14类毒蘑菇 带标注 voc yolo

毒蘑菇检测数据集 9200张 14类毒蘑菇 带标注 voc yolo 分类名: (图片张数,标注个数) Amanita citrina: (700, 816) Gyromitra infula: (842, 1102) Hygrophoropsis aurantiaca: (766, 1578) Imleria badia: (794, 1027) Lactarius turpis: (728, 891) Boletus reticulatus: (67…

OpenFegin

文章目录 一、OpenFegin是什么&#xff1f;二、基本使用三、超时重试机制4.自定义超时重传机制五、底层实现 一、OpenFegin是什么&#xff1f; OpenFeign的全称为Spring Cloud OpenFeign(下文简称OpenFeign),是Spring Cloud团队开发的一款基于 Feign的框架&#xff0c;声明式W…

MySQL数据库备份与恢复的深度解析

作为一名资深DBA&#xff0c;深知数据库备份与恢复在企业数据管理中的重要性。数据是企业的核心资产&#xff0c;任何数据的丢失都可能对业务造成不可挽回的损失。本文将深入探讨MySQL数据库的备份与恢复策略&#xff0c;旨在帮助您建立健全的数据保护机制。 一、为什么备份与…

String、StringBuilder

internal class Mainclus { internal static void Main(string[] args) { //创建方式 string a = "*world"; string new1 = "hello*world"; string new2 = "hello" + "*world"; …

AI时代来袭,程序员怎样才能不被淘汰?

大家好&#xff01;今天我们来聊聊一个非常热门的话题&#xff1a;在AI时代&#xff0c;程序员应该如何提升自己&#xff0c;避免被行业淘汰。 随着人工智能技术的飞速发展&#xff0c;很多传统职业都面临着重新定义的挑战&#xff0c;程序员也不例外。那么&#xff0c;作为一…

ChatGPT推出Canvas功能

"Canvas" 是 OpenAI 推出的全新界面&#xff0c;专为增强写作和编程协作而设计。它让用户能够在聊天之外更高效地进行编辑、审阅和反馈&#xff0c;提供了内联编辑、代码调试和文档版本控制等功能。目前&#xff0c;"Canvas" 已面向 ChatGPT Plus 和 Team …

【JavaEE】【多线程】Thread类讲解

目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用…