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

news2024/12/24 20:44:26

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

文章目录

  • 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为空,入队q2
            q2.offer(x);
        } else {
            //2.2 q2为空,入队q1
            q1.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.coloradmin.cn/o/1583482.html

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

相关文章

doss攻击为什么是无解的?

这个让Google、亚马逊等实力巨头公司也无法避免的攻击。可以这么说&#xff0c;是目前最强大、最难防御的攻击之一&#xff0c;属于世界级难题&#xff0c;并且没有解决办法。 Doss攻击的原理不复杂&#xff0c;就是利用大量肉鸡仿照真实用户行为&#xff0c;使目标服务器资源…

【漏洞复现】WordPress Welcart 任意文件读取漏洞(CVE-2022-4140)

0x01 产品简介 Welcart 是一款免费的 WordPress 电子商务插件。Welcart 具有许多用于制作在线商店的功能和自定义设置。您可以轻松创建自己的原始在线商店。 0x02 漏洞概述 Welcart存在任意文件读取漏洞&#xff0c;未授权的攻击者可以通过该漏洞读取任意文件&#xff0c;获…

【无标题】系统思考—心智模式

“直到你使无意识变为有意识&#xff0c;它将指导你的生活并且你会称之为命运。”—卡尔荣格 心智模式深藏于我们内心之中&#xff0c;它潜移默化地影响着我们对世界的理解和判断。往往这些影响是如此隐蔽&#xff0c;以至于我们自己都未必察觉到是什么在驱动我们的选择、决策…

利用Python ARM网关仓储物流AGV小车控制器

在现代智慧物流体系中&#xff0c;高效的信息管理系统是物流中心实现精准跟踪货物、科学管理库存及优化配送路线的关键环节。通过采用ARM架构的工控机或网关&#xff0c;并结合Python的二次开发能力&#xff0c;可以有效集成并强化物流管理系统的数据处理与通信功能&#xff0c…

最坏情况为线性时间的第k大元素

在统计和数据分析中&#xff0c;我们经常会遇到求最大值、最小值、中位数、四分位数、Top K等类似需求&#xff0c;其实它们都属于顺序统计量&#xff0c;本文将对顺序统计量的定义和求解算法进行介绍&#xff0c;重点介绍如何在最差时间复杂度也是线性的情况下求解第k大元素。…

代码随想录:栈与队列4-6

20.有效的括号 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一…

OpenHarmony分布式软总线API调用测试工具 softbus_tool使用说明

softbus_tool 是 OpenHarmony 分布式软总线 API 调用测试工具&#xff0c;文件结构如下图所示。 softbus_tool 能够将软总线 interfaces 目录下的一些常用接口集中起来&#xff0c;供设备间搭建一些场景时使用&#xff08;比如设备绑定、BR 组网&#xff0c;BLE 组网&#xff…

红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程

HTTP版RTU&#xff08;支持GNSS&#xff09;项目概述 RTU&#xff08;Remote Terminal Unit&#xff09;&#xff0c;中文即远程终端控制系统&#xff0c;负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置&#xff0c;通常由信号输入/出模块、微…

ArrayList中多线程的不安全问题

ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出&#xff0c;是一种函数是接口&#xff0c;我们先过个耳熟 Arrys.asList是返回一个ArrayL…

Redis高级-分布式缓存RDB原理

分布式缓存 1.1.2.RDB原理 bgsave开始时会fork主进程得到子进程&#xff0c;子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术&#xff1a; 当主进程执行读操作时&#xff0c;访问共享内存&#xff1b;当主进程执行写操…

振弦式应变计在岩土工程中的应用

岩土工程是土木工程的一个重要分支&#xff0c;主要研究岩石、土壤等天然材料的工程特性及其在工程中的应用。它涉及地基基础、边坡工程、隧道工程、水利水电工程等众多领域&#xff0c;是保障建筑物安全、稳定的基础性工程。 点击输入图片描述&#xff08;最多30字&#xff09…

rabbitmq延迟队列的使用

rabbitmq延迟队列的使用 1、场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&a…

再也不怕面试官问 OOM了,一次生产环境 Metaspace OOM 排查流程实操!

问题背景 小奎公司的运维同时今天反映核心业务一个服务目前 CPU 的使用率、堆内存、非堆内存的使用率有点高。刚反映没有过多久该服务就直接 OOM 了&#xff0c;以下是生产监控平台监控信息。 CPU 使用率监控 堆内存和非堆内存使用率 OOM 产生的日志报错信息 问题分析 根…

kali使用msf+apkhook520+cploar实现安卓手的攻击

学习网络安全的过程中&#xff0c;突发奇想怎么才能控制或者说是攻击手机 边找工作边实验 话不多说启动kali 一、使用msfapktool生成简单的木马程序 首先使用kali自带的msfvenom写上这样一段代码 选择安卓 kali的ip 一个空闲的端口 要输出的文件名 msfvenom -p android/met…

9个最受欢迎的开源自动化测试框架盘点!

自动化测试框架可以帮助测试人员评估多个Web和移动应用程序的功能&#xff0c;安全性&#xff0c;可用性和可访问性。尽管团队可以自己构建复杂的自动化测试框架&#xff0c;但是当他们可以使用现有的开源工具&#xff0c;库和测试框架获得相同甚至更好的结果时&#xff0c;通常…

ubuntu系统逻辑卷Logical Volume扩容根分区

Linux LVM详解 https://blog.csdn.net/qq_35745940/article/details/119054949 https://blog.csdn.net/weixin_41891696/article/details/118805670 https://blog.51cto.com/woyaoxuelinux/1870299 LVM&#xff08;Logical Volume Manager&#xff09;逻辑卷管理&#xff0c…

C++入门语法(命名空间缺省函数函数重载引用内联函数nullptr)

目录 前言 1. 什么是C 2. C关键字 3. 命名空间 3.1 命名空间的定义 3.2 命名空间的使用 4. C输入和输出 5. 缺省函数 5.1 概念 5.2 缺省参数分类 6. 函数重载 6.1 概念 6.2 为何C支持函数重载 7. 引用 7.1 概念 7.2 特性 7.3 常引用 7.4 引用与指针的区别 7…

OSCP靶场--Hetemit

OSCP靶场–Hetemit 考点(python代码注入 systemctrl提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.117 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-10 05:52 EDT Nmap scan report for 192.168.1…

详解多态、虚继承、多重继承内存布局及虚表(C++)

本篇文章深入分析多态、虚继承、多重继承的内存布局及虚函数表以及实现原理。编译器使用VS 2022&#xff0c;直接放结论&#xff0c;代码及内存调试信息在后文。 结论 内存布局 一个没有虚函数的类&#xff0c;它的大小其实就是所有成员变量的大小&#xff0c;此时它就是一个…

13 指针(上)

指针是 C 语言最重要的概念之一&#xff0c;也是最难理解的概念之一。 指针是C语言的精髓&#xff0c;要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方&#xff0c;就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…