【数据结构练习题】队——1.用队实现栈2.用栈实现队

在这里插入图片描述
♥♥♥♥♥个人主页♥♥♥♥♥
♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥
♥♥♥♥♥上一章:堆的练习题♥♥♥♥♥

文章目录

  • 1.用队去实现栈
    • 1.1问题描述
    • 1.2思路分析
    • 1.3绘图分析
    • 1.4代码实现
    • 2.用栈实现队
    • 2.1问题描述
    • 2.2思路分析
    • 1.3绘图分析
    • 2.4代码实现

1.用队去实现栈

1.1问题描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

1.2思路分析

首先,要实现用队去模拟一个有压栈,入栈,peek,判断栈是否为空这些功能的栈,用一个简单的队列是不能实现这个栈的,用一个双向队列是可以实现这个栈的,但我们今天不用双向队列来实现,我们用两个简单队列来实现这个栈。
在分析具体功能怎么实现的,我们先确定一些大前提:
1.我们先要创建两个简单队列分别设为q1,q2
2.确保这两个队列中必须是空的
接下来分析这些功能怎么实现的:
1.压栈
大前提:在压栈的过程中,始终需要保证一个队列中是空,目的是为了出栈
在压栈的过程中分两种情况:
1.1如果在压栈前两个队列都为空,则默认压入q1
1.2如果在压栈前有一个队是空的,则压入另一个不为空的队列中
2.出栈
2.1如果两个队列都是空,则直接返回false
2.2如果一个队列为空,另一个不为空,则只需要将不为空队列q1中的size-1个元素压到另一个队列q
2中然后最后不为空的队列q1中剩下的就是出栈的元素
3.peek
3.1如果两个队列都是空,则直接返回false
3.2如果一个队列为空,另一个不为空,则只需要将不为空队列q1中的size-1个元素压到另一个队列q
2中然后最后不为空的队列q1中剩下的元素只需要对它进行peek操作即可
4.empty
两个队列都为空,则栈为空。

1.3绘图分析

1.压栈
在这里插入图片描述
2.出栈
在这里插入图片描述

1.4代码实现

public class QueueAchieveStack {Queue<Integer> q1;Queue<Integer> q2;public QueueAchieveStack() {q1 = new LinkedList<>();q2 = new LinkedList<>();}public void push(int x) {//1.两个队列都为空if(empty()) {q1.offer(x);return;}//2.假设只有一个队列为空if(!q2.isEmpty()) {//2.1 q1为空,入队q2q2.offer(x);} else {//2.2 q2为空,入队q1q1.offer(x);}}public int pop() {//1.两个队列都是空if(empty()) {return -1;}//2.只有一个队为空if(!q2.isEmpty()) {//2.1 q1队列为空,那么将q2中size-1的元素入到q1中,最后直接出q2的元素int size1 = q2.size();for (int i = 0; i <size1-1 ; i++) {q1.offer(q2.poll());}return q2.poll();} else {//2.2 q2队列为空,那么将q1中size-1的元素入到q2中,最后直接出q1的元素int size2 = q1.size();for (int i = 0; i <size2-1 ; i++) {q2.offer(q1.poll());}return q1.poll();}}public int top() {//1.两个队列都是空if(empty()) {return -1;}//2.只有一个队为空if(!q2.isEmpty()) {//2.1 q1队列为空,用一个中间变量tmp来存储每一次从q2出队的元素,然后在入q1中int size1 = q2.size();int tmp = -1;for (int i = 0; i <size1 ; i++) {tmp = q2.poll();q1.offer(tmp);}return tmp;} else {//2.2 q2队列为空,用一个中间变量tmp来存储每一次从q1出队的元素,然后在入q2中int size2 = q1.size();int tmp = -1;for (int i = 0; i <size2; i++) {tmp = q1.poll();q2.offer(tmp);}return tmp;}}public boolean empty() {return q1.isEmpty() && q2.isEmpty();}
}

2.用栈实现队

2.1问题描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false

2.2思路分析

首先,要实现用栈去模拟一个有入队,出队,peek,判断栈是否为空这些功能的队,我们用一个栈也是不能模拟出队列的,我们用两个栈来模拟这个队列,但是这里和队列实现栈的两个队列不一样,这里的两个栈,我们分别设置一个入队的栈,一个专门出队的栈。相比用队列模拟实现栈,队列模拟实现栈简单一些。
大前提:
1.我们先要创建两个简单栈分别设为s1为入队的栈,q2出队的栈
2.确保这两个栈中必须是空的
接下来分析这些功能怎么实现的:
1.入队
直接将元素压入s1栈中即可
2.出队
2.1如果s2栈中为空,则将s1栈中的元素全部弹出,入栈到s2栈中,然后再弹出s2中栈顶的元素即可
2.2如果s2栈中不为空,则直接弹出s2栈顶的元素
3.peek
3.1如果s2栈中为空,则将s1栈中的元素全部弹出,入栈到s2栈中,然后再peeks2中栈顶的元素即可
3.2如果s2栈中不为空,则直接peeks2栈顶的元素
4.empty
直接判断这两个栈是否为空

1.3绘图分析

1.入队
在这里插入图片描述
2.出队
2.1 s2为空:
在这里插入图片描述
2.2 s2不为空:
在这里插入图片描述

2.4代码实现

public class StackAchieveQueue {Stack<Integer> s1;Stack<Integer> s2;public StackAchieveQueue() {s1 = new Stack<>();s2 = new Stack<>();}public void push(int x) {//直接将s1当作一个入队的操作s1.push(x);}public int pop() {//判断s2中空不空if(!s2.isEmpty()) {//不空直接弹出元素return s2.pop();} else {//空则将s1中的元素全部都入到s2栈中,再弹出s2的元素int size = s1.size();for(int i=0; i<size; i++) {s2.push(s1.pop());}}return s2.pop();}public int peek() {//判断s2中空不空if(!s2.isEmpty()) {//不空直接返回栈顶元素return s2.peek();} else {//空则将s1中的元素全部都入到s2栈中,再返回s2栈顶的元素int size = s1.size();for(int i=0; i<size; i++) {s2.push(s1.pop());}}return s2.peek();}public boolean empty() {return s1.isEmpty() && s2.isEmpty();}
}

结尾:希望大家可以给我点点关注,点点赞,并且在评论区发表你们的想法和意见,我会认真看每一条评论,你们的支持就是我的最大鼓励。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS学习 -- 再识

工作中一直使用FreeRTOS进行着开发&#xff0c;但是没有进行过系统的总结过。现在将快速使用几天时间将FreeRTOS相关知识点加以总结。 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 参看资料&#xff1a; 正点原子 STM32F1 FreeRTOS开发手册_V1.2.pdf The FreeRTOS…

Linux CPU利用率

Linux CPU利用率 在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单&#xff0c;说复杂也不是那么…

MySQL——Linux安装包

一、下载安装包 MySQL下载路径&#xff1a; MySQL :: MySQL Downloads //默认下载的企业版MySQL 下载社区版MySQL MySQL :: MySQL Community Downloads 1、源码下载 2、仓库配置 3、二进制安装包 基于官方仓库安装 清华centos 软件仓库&#xff1a; Index of /cen…

使用Mac自带终端进行远程ssh连接Linux服务器

废话不多说&#xff0c;直接上图 好吧&#xff0c;我承认我是多此一举&#xff0c;脱裤子放pi了&#xff0c;其实只需要在终端输入一行命令就可以了&#xff08;呜呜&#xff5e;&#xff09; ssh rootip -p 22 需要注意的是&#xff0c;命令里的ip地址同样要替换成你自己的服…

前端工程化理解 (2024 面试题)

最好介绍远古世界最好随性一点&#xff0c;不要太刻板 &#xff0c;不然像背书 什么是前端工程化&#xff1f; - 知乎 前端工程化的历史 互联网初期&#xff0c;09 年以前&#xff0c;页面只需要展示一些列表、表格、文章内容以及简单图片即可&#xff0c;其目的是为了传送信…

证明:有依赖背包结点数优化后为O(n^2)

证明&#xff1a;有依赖背包结点数优化后为 O ( n 2 ) O(n^2) O(n2) siz[u]表示以u为根的树的结点数 深搜过程中&#xff0c;siz[u]表示根结点为u的树的根结点加上前i个子树的结点数。 根结点为u的树取前i个子树的结点&#xff0c;取到的结点数量小于等于siz[u]根结点为v的子…

SpringCloudAlibaba

文章目录 一、SpringCloudAlibaba是什么&#xff1f;二、核心组件1 Nacos1.1 Nacos介绍1.2 什么是Nacos&#xff1f;1.3 为何使用Nacos&#xff1f; 2.Sentinel2.1 什么是Sentinel2.2 Sentinel好处 3 GateWay3.1 网关介绍3.2 GateWay3.3 基本概念&#xff1a; 4 Seata4.1 分布式…

4.进程相关

1.关于进程和程序的相关定义 1.1 程序的相关定义 程序通俗来讲就是我们的源代码文件&#xff0c;然后里面还包含了其他的文件信息 程序入口地址&#xff1a;也就是 main 函数的位置 1.2 进程的相关定义 进程需要资源&#xff1a;CPU &#xff0c;内存 进程是一个抽象定义&a…

QDataStream:使用指南、技巧与注意事项

QDataStream是Qt框架中用于处理二进制数据序列化和反序列化的核心类。它提供了高效、跨平台的方式&#xff0c;将C数据结构转化为字节流&#xff0c;便于在网络传输、持久化存储等场景下使用。本文将详尽解析QDataStream的使用方法、实用技巧以及在实际应用中应注意的问题。 一…

免费游戏云服务器推荐,一键搭建我的世界(MC)及幻兽帕鲁服务器!

随着云计算的普及和发展&#xff0c;越来越多的人开始尝试在云服务器上搭建游戏服务器。本文将为大家推荐一款免费游戏云服务器&#xff0c;可以一键搭建我的世界(MC)或者幻兽帕鲁服务器。 雨云是一家国内的云计算服务提供商&#xff0c;为了吸引用户&#xff0c;推出了积分免费…

从误差分解看Few-shot的核心问题

FSL训练过程一般都是最小化经验误差ERM。 同时&#xff0c;由于现实任务的实际数据分布 是未知的&#xff0c;因此无法找到一个最优的参数组合 &#xff0c;能最小化期望损失&#xff08;最小值多少也是未知的&#xff09;&#xff0c;我们能做的实际上是尽可能的去找一个参数…

【大数据篇】Flink全面入门指南

Apache Flink 是一个开源的流处理框架&#xff0c;用于在高吞吐量和低延迟的条件下处理无界和有界数据流。Flink 设计用于运行在所有常见的集群环境&#xff0c;如 Hadoop YARN、Apache Mesos 和 Kubernetes 上&#xff0c;并以“流式计算”为核心思想&#xff0c;同时也支持批…

如何打造一个好的(Vue)组件库?这里有一个清单

你是否考虑过在 Vue.js 或其他框架中构建组件库&#xff0c;或者你需要它来构建可重用的设计系统&#xff0c;以减少投入市场的时间并提供视觉一致性&#xff0c;或者你想为社区贡献另一个组件库。 你可能想立即投入进去并开始编码&#xff0c;但是首先你必须退后一步&#xf…

redis string底层为什么使用sds, sds好处?redis 的动态字符串优点?

1. redis 的键值对&#xff0c;都是由对象组成的&#xff0c; 其中键总是一个字符串对象&#xff08;string object&#xff09; 而键的value则可以是&#xff1a;“字符串对象”&#xff0c; “列表对象 &#xff08;list object&#xff09;”&#xff0c;“哈希对象 (hash o…

Jtti云服务器是怎么实现云端数据分发和内容传输优化?

云服务器通过实现云端数据分发和内容传输优化来提高性能、可靠性和效率。这通常涉及以下几个方面的技术和方法&#xff1a; 1. CDN(内容分发网络) 内容分发网络(CDN)是一种分布式网络架构&#xff0c;用于将内容(如网页、图像、视频等)分发到全球各地的用户。CDN通过在全球各地…

蓝桥杯每日一题(背包dp,线性dp)

//3382 整数拆分 将 1,2,4,8看成一个一个的物品&#xff0c;以完全背包的形式放入。 一维形式&#xff1a;f]0]1; #include<bits/stdc.h> using namespace std; //3382整数拆分 const int N1e610, M5e510; int mod1e9; int f[N],n; int main() {cin>>n;//转化为完…

linux 迁移home目录以及修改conda中pip的目录,修改pip安装路径

1&#xff09;sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行复制&#xff08;假设机械硬盘挂载在/data目录下&#xff09;** 2&#xff09;usermod -d /data/home/lrf -m lrf 修改用户$HOME变量** 3&#xff09;vi /etc/passwd 查看对应用户的$HOME变量是…

网络安全加密算法---对称加密

三位同学一组完成数据的对称加密传输。 三位同学分别扮演图中 A、B 和 KDC 三个角色&#xff0c;说明 KA、KB&#xff0c;KAB 和发送的数据Data 的内容。 给出图中 2 和 3 中的数据&#xff0c;以及 Data 加密后的密文。可以完成多轮角色互换的通信 过程。其中一轮过程要求 K…

洗地机如何选?入手这四款优质好有,幸福感爆棚!

家庭清洁作为每天都必干的一件事&#xff0c;房屋的整洁是让人保持心情愉悦的一种方式。不过每次拿着清洁工具一顿劳作后总是会腰酸背痛&#xff0c;但是洗地机的出现为我们解放了双手。相对于传统的清洁工具&#xff0c;洗地机功能更多样更高效。那么市面上洗地机哪个牌子好&a…

LeetCode31. 下一个排列(Java)

题目&#xff1a; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列…