【数据结构练习题】队——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;说复杂也不是那么…

使用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;其目的是为了传送信…

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…

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

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

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

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

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

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

蓝桥杯每日一题(背包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] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列…

PyQt PySide6零基础入门与项目实战视频教程

目录 课程亮点课程大纲第一章&#xff1a;基础篇 PySide6开发环境安装第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍第三章 信号槽与事件机制第四章 QMainWindow应用篇第五章 样式表qss与自定义控件第六章 图表与曲线第七章 数据库编程第八章 项目实战&#xff1a;高…

Java—抽象方法与接口

声明&#xff1a;以下内容是根据B站黑马程序员的Java课程&#xff0b;博主自己的理解整理而成&#xff0c;课程很好&#xff0c;适合初学者学习。 关于此类题目&#xff0c;重要的是识别出用什么来实现&#xff0c;到底是接口还是抽象方法&#xff0c;还是共有的属性等等&…

QT:事件机制

作业&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include<QPushButton> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

Vue3---基础1(认识,创建)

变化 相对于Vue2&#xff0c;Vue3的变化&#xff1a; 性能的提升 打包大小减少 41% 初次渲染快 55%&#xff0c;更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…

Redis中的集群(四)

集群 槽指派 CLUSTER ADDSLOTS命令的实现 CLUSTER ADDSLOTS命令接受一个或多个槽作为参数&#xff0c;并将所有输入的槽指派给接收该命令的节点负责: CLUSTER ADDSLOTS <slot> [slot ...]CLUSTER ADDSLOTS命令的实现可以用以下伪代码来表示: def CLUSTER_ADDSLOTS(*…

JavaScript - 请你为数组自定义一个方法myFind,使其实现find方法的功能

难度级别:中级及以上 提问概率:50% 我们知道数组的find方法是ES6之后出现的,它强调找到第一个符合条件的元素后即跳出循环,不再继续执行,那么如果不用ES6的知识,为数组添加一个自定义方法实现find方法的功能,首先要想到在数组的原型pro…