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

server/2025/1/16 0:04:37/

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();}
}

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


http://www.ppmy.cn/server/158694.html

相关文章

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器&#xff0c;基于 Region 内存布局的&#xff0c;不设分代&#xff0c;使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障&#xff0c;而 ZGC 用到了读屏障 染色指针&a…

2025年01月13日Github流行趋势

1. 项目名称&#xff1a;Jobs_Applier_AI_Agent 项目地址url&#xff1a;https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言&#xff1a;Python历史star数&#xff1a;25929今日star数&#xff1a;401项目维护者&#xff1a;surapuramakhil, feder-cr, cjbbb, sarob…

13:00面试,13:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包&#xff1a; https://downloads.mysql.com/archives/community/ 2、在线下载&#xff0c;使用wget命令&#xff0c;直接从官网下载到linux服务器上 wget https://downloads.mysql.co…

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid&#xff0c;数组由 正整数 组成。 你的任务是以 之字形 遍历 grid&#xff0c;同时跳过每个 交替 的单元格。 之字形遍历的定义如下&#xff1a; 从左上角的单元格 (0, 0) 开始。在当前行中向…

Golang笔记——数组、Slice、Map、Channel的并发安全性

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Golang常用数据类型的并发安全性&#xff0c;特别是复合数据类型&#xff08;数组、Slice、Map、Channel&#xff09;的并发安全性。 文章目录 线…

【Artificial Intelligence篇】AI 入侵家庭:解锁智能生活的魔法密码,开启居家梦幻新体验

家庭智能化的时代已经到来&#xff0c;准备好了嘛&#xff01;&#xff01;&#xff01; 在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能&#xff08;AI&#xff09;宛如一位神秘而强大的魔法师&#xff0c;悄然 “入侵” 了我…

CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)

目录 一、左边定宽 右边自适应 1.浮动 2.利用浮动margin 3.定位margin 4.flex布局 5.table 布局 二、左右成比自适应 1:1 1flex布局 table布局 1:2 flex布局 三列布局链接&#xff1a;CSS | 实现三列布局&#xff08;两边边定宽 中间自适应&#xff0c;自适应成比&#xff09;-…