首页 > 其他分享 >数据结构:栈(Stack)和队列(Queue)—面试题(二)

数据结构:栈(Stack)和队列(Queue)—面试题(二)

时间:2025-01-13 13:32:50浏览次数:3  
标签:count que1 面试题 return 队列 Queue int que2 Stack

1. 用队列实现栈。

习题链接icon-default.png?t=O83Ahttps://leetcode.cn/problems/implement-stack-using-queues/description/描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

根据题意,他要我们用两个队列来实现一个栈,我们知道栈和队列的出数据的方式是不同的,栈是后进先出,队列是先进后出,那么我们该如何用两个队列实现后进先出呢?

 

我们知道当这两个队列都为空是,所代表我们要创建的栈也为空。

我们要进行入栈时,如果我们的栈为空。就将数据放到队列1中,如果栈不为空,代表两个队列都都不为空或者有一个队列不为空,此时是队列1不为空,将数据放入队列1中,如果是队列2不为空,将数据放入队列2中

我们要进行出栈时,如果栈为空不能出数据,如果栈不为空,我们知道队列是先进先出,而栈是先进后出,此时要出的数据应该是我们队列的最后一个数据才是,因此我们可以将我们队列不为空的数据除最后一个数据外全部弹出放入到此时为空的队列当中,并让剩最后一个数的队列将最后一个数弹出,此时弹出的数就是我们栈要出的数据。

我们要获得栈顶元素时,我们可以像出栈方式一样,最后我们让最后一位数据进行队列的查找即可,这样就没有删除最后一个元素,但是这种方式是有问题的,我们发现如果我们将除最后一个元素都放到另一个队列当中了,而最后一个元素依然在另一个队列,但是,栈的查找是不改变数据的形式的,如果我们还用这种方式就改变了他的形式,因此我们可以创建一个变量,将一个队列的所有元素都经过这个变量,然后在将这个变量的值放到另一个队列中,这时我们变量的最后一个值就是我们要查找的栈顶元素

完整代码 

class MyStack {

    Queue<Integer> que1;
    Queue<Integer> que2;

    public MyStack() {
        que1 = new LinkedList<>();
        que2 = new LinkedList<>();
    }
    
    public void push(int x) {
        if(empty()){
            que1.offer(x);
            return;
        }

        if(!que1.isEmpty()){
            que1.offer(x);
        }else{
            que2.offer(x);
        }
    }
    
    public int pop() {
        if(empty()){
            return -1;
        }
        if(!que1.isEmpty()){
            int count = que1.size();
            while(count-1 != 0){
                que2.offer(que1.poll());
                count--;
            }
            return que1.poll();
        }else{
            int count = que2.size();
            while(count-1 != 0){
                que1.offer(que2.poll());
                count--;
            }
             return que2.poll();
        }
        
    }
    
    public int top() {
        if(empty()){
            return -1;
        }
        if(!que1.isEmpty()){
            int count = que1.size();
            int tmp = -1;
            while(count != 0){
                tmp = que1.poll();
                que2.offer(tmp);
                count--;
            }
            return tmp;
        }else{
            int count = que2.size();
            int tmp = -1;
            while(count != 0){
                tmp = que2.poll();
                que1.offer(tmp);
                count--;
            }
            return tmp;
        }
        
    }
    
    public boolean empty() {
        return que1.isEmpty() && que2.isEmpty();
    }
}

2. 用栈实现队列。

描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

根据题意,他要我们用两个栈实现一个队列,这会我们要用两个栈实现一个先进先出的队列

我们知道当这两个栈都为空是,所代表我们要创建的队列也为空。

我们要进行入队列时,我们让栈1专门作为入数据的栈.

我们要进行出队列时,如果队列为空,就不能删除,如何不为空,同时栈2为空我们就将栈1的所有数据都放到栈2中,由于栈是后进先出,这就让栈的数据都颠倒了过来,这时我们再让栈2出栈,此时出栈的次序就是我们队列的出数据顺序

我们要进行查找队头元素时,我们还是出队的方法,最后让栈进行栈顶元素的查找即可,因为我们上述的出队方式并没有改变数据的形式没有 

完整代码 

class MyQueue {

    Stack<Integer> stack1;
    Stack<Integer> stack2;

    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void push(int x) {
        stack1.push(x);
    }
    
    public int pop() {
        if(empty()){
            return -1;
        }

        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
    
    public int peek() {
         if(empty()){
            return -1;
        }

        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek();
    }
    
    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }
}

好了今天的分享就到这里了,还请大家多多关注,我们下一篇见!

标签:count,que1,面试题,return,队列,Queue,int,que2,Stack
From: https://blog.csdn.net/zm3rttqs9f/article/details/145112984

相关文章

  • 数据结构:栈(Stack)和队列(Queue)—面试题(一)
    目录1、括号匹配2、逆波兰表达式求值 3、栈的压入、弹出序列4、最小栈 1、括号匹配习题链接https://leetcode.cn/problems/valid-parentheses/description/描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必......
  • Java程序员不得不会的124道面试题(含答案)
    1)什么是线程局部变量?线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如web服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何......
  • OpenStack 网络服务的原理和流程
    OpenStack的网络服务(Neutron)在云计算环境中起着至关重要的作用,它负责管理和提供网络连接,使得虚拟机和其他资源能够相互通信。以下将详细介绍OpenStack网络服务的原理和流程。一、OpenStack网络服务原理OpenStack的网络服务Neutron旨在为云计算环境提供灵活、可扩......
  • SpringBoot面试题(2025)
    什么是SpringBoot?多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。如果必须启动一个新的Spring项目,我们必须添加构建路径或添加Maven依赖关系,配置应......
  • 转:CELERY CELERY_QUEUES和CELERY_ROUTS的用法
    转自:https://www.jianshu.com/p/4d0bbdbc6ade?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation1.介绍Celery非常容易设置,通常都是使用默认的queue来存放任务,写法如下:@app.taskdeftask1(x,y):for_inrange(10):......
  • Java面试题汇总-Java基础篇(共50道题)
    Java基础目录Java基础一、java中的序列化和反序列化是什么?二、什么是java的不可变类?三、Java中Exception和Error有什么区别?四、你觉得java的优势是什么?五、什么是java的多态特性?六、java中的参数传递是按值还是按引用?七、为什么java不支持多重继承?八、面向对象......
  • #【鸿蒙面试题】分享几个不怎么注意到的面试题
    Navigation中哪个生命周期可以获取到页面栈,怎么获取的?Navigation的onReady生命周期中可以获取到页面栈,通过回调函数获取的。.onReady((context:NavDestinationContext)=>{context.pathStack})鸿蒙的后台任务类型有哪些短时任务:实时性要求较高的任务,比如状态保存长时任......
  • 代码随想录算法训练营第4天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面
    一、刷题部分1.124.两两交换链表中的节点原文链接:代码随想录题目链接:24.两两交换链表中的节点-力扣(LeetCode)1.1.1题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输......
  • 整理字节腾讯阿里等数百份大厂面经:Java多线程和线程安全最高频面试题及参考答案
    多线程(并发编程)和线程安全几乎是每场面试必问的问题,下面面试题是从字节跳动、腾讯和阿里等几百份的面试题整理的,面试时出现频率很高的。目录Java对锁的优化机制是怎样的?无锁是怎么回事?CAS锁原理是什么?它跟CPU底层的指令有关系吗?ABA问题是怎么回事?说说synchronized和......
  • 全网网络安全面试题大全(整理版)稳了
    前言随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。为了拿到心仪的Offer之外,除了学好网络安全知识以外,还要应对好企业的面试。一、web安全岗面试题1.1、什么是 SQL注入攻击?如何防止SQL注入攻击?SQL注入攻击是指攻击者......