【数据结构】 栈与队列的相互实现

文章目录

  • 🌏引言
  • 🍀[队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/)
    • 🐱‍🏍题目描述:
      • 📌注意事项:
      • 📌示例与提示:
    • 🐱‍🐉思路解析:
      • 🚩入栈
      • 🚩出栈
      • 🚩获取栈顶元素
      • 🚩判断是否为空
    • 🐱‍👤完整代码实现:
  • 🎄[用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)
    • 🐱‍👓题目描述
      • 📌说明
      • 📌示例
    • 🐱‍🏍解法思路:
    • 🐱‍🐉代码实现
  • ⭕总结

🌏引言

队列与栈的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于队列与栈的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
在这里插入图片描述

🍀队列实现栈

🐱‍🏍题目描述:

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

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
class MyStack {public MyStack() {}public void push(int x) {}public int pop() {}public int top() {}public boolean empty() {}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

📌注意事项:

  • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。

  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

📌示例与提示:

在这里插入图片描述

🐱‍🐉思路解析:

我们用两个队列来实现栈
在这里插入图片描述
整体思路为
在这里插入图片描述
后面会有每一步的解析

🚩入栈

入栈时:

  • 我们队两个队列进行检查,那个队列不为空,我们就把元素放在那个队里
  • 若都无元素,则我们让它放在qu1里
  • 在这里插入图片描述

实现如下:

    public void push(int x) {if(!qu1.isEmpty()) {qu1.offer(x);} else if (!qu2.isEmpty()) {qu2.offer(x);}else {qu1.offer(x);}}

🚩出栈

出栈时:

  • 我们将不为空的队列出size-1个元素到另一个队列里
  • 例如:
  • 在这里插入图片描述
  • 最后弹出qu1里面元素就好

代码实现如下:

    public int pop() {if(empty()) {return -1;//两个队列都为空,意味着当前的栈为空}if(!qu1.isEmpty()) {int size = qu1.size();for (int i = 0; i < size-1; i++) {//for (int i = 0; i < qu1.size()-1; i++) {int val = qu1.poll();qu2.offer(val);}return qu1.poll();}else {int size = qu2.size();for (int i = 0; i < size-1; i++) {int val = qu2.poll();qu1.offer(val);}return qu2.poll();}}

🚩获取栈顶元素

与出栈实现方法类似,不同的地方在于

  • 获取不是删除,所以需要将不为空的队列元素全部拿到另一个队列里
  • 我们在删除时引入了一个val,它每一次回记录一个元素
  • 当遍历结束时,val记录的便是栈顶元素
  • 在这里插入图片描述
  • 所以直接返回val即可

代码实现如下:

    public int top() {if(empty()) {return -1;//两个队列都为空,意味着当前的栈为空}if(!qu1.isEmpty()) {int size = qu1.size();int val = -1;for (int i = 0; i < size; i++) {val = qu1.poll();qu2.offer(val);}return val;}else {int size = qu2.size();int val = -1;for (int i = 0; i < size; i++) {val = qu2.poll();qu1.offer(val);}return val;}}

🚩判断是否为空

只要qu1与qu2都为null时,这时候队列就为空

代码实现如下:

    public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}

🐱‍👤完整代码实现:

class MyStack {private Queue<Integer> qu1;private Queue<Integer> qu2;public MyStack() {qu1 = new LinkedList<>();qu2 = new LinkedList<>();}public void push(int x) {if(!qu1.isEmpty()) {qu1.offer(x);} else if (!qu2.isEmpty()) {qu2.offer(x);}else {qu1.offer(x);}}public int pop() {if(empty()) {return -1;//两个队列都为空,意味着当前的栈为空}if(!qu1.isEmpty()) {int size = qu1.size();for (int i = 0; i < size-1; i++) {//for (int i = 0; i < qu1.size()-1; i++) {int val = qu1.poll();qu2.offer(val);}return qu1.poll();}else {int size = qu2.size();for (int i = 0; i < size-1; i++) {int val = qu2.poll();qu1.offer(val);}return qu2.poll();}}//peekpublic int top() {if(empty()) {return -1;//两个队列都为空,意味着当前的栈为空}if(!qu1.isEmpty()) {int size = qu1.size();int val = -1;for (int i = 0; i < size; i++) {val = qu1.poll();qu2.offer(val);}return val;}else {int size = qu2.size();int val = -1;for (int i = 0; i < size; i++) {val = qu2.poll();qu1.offer(val);}return val;}}public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

🎄用栈实现队列

🐱‍👓题目描述

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

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false
class MyQueue {public MyQueue() {}public void push(int x) {}public int pop() {}public int peek() {}public boolean empty() {}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

📌说明

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop fromtop, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

📌示例

在这里插入图片描述

🐱‍🏍解法思路:

这个实现起来就简单多了

我们同样用两个栈来实现队列
在这里插入图片描述

  • 入栈的元素全部放入stack1中

  • 在这里插入图片描述

  • 出栈时,检查stack2是否为null,若为null

  • 则直接将stack1的元素出栈后入到stack2里

  • 然后弹出栈顶元素即可

  • 在这里插入图片描述

  • 获取队列开头元素时,直接获取stck2栈顶元素就好了

  • 判断是否为null时,只要两个栈都为空,则队列就为null

🐱‍🐉代码实现

import java.util.Stack;class MyQueue {private Stack<Integer> stack1;private 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.empty()) {while (!stack1.empty()) {stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {if (empty()) {return -1;}if (stack2.empty()) {while (!stack1.empty()) {stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {return stack1.empty() && stack2.empty();}
}
/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

⭕总结

关于《【数据结构】 栈与队列的相互实现》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

云计算在线实训系统建设方案

一、 人工智能与云计算系统概述 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一种模拟人类智能的科学和工程&#xff0c;通过使用计算机系统来模拟、扩展和增强人类的智能能力。人工智能涉及多个领域&#xff0c;包括机器学习、深度学习、自然…

2023全国大学生数学建模竞赛B题思路模型代码

目录 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 3.思路获取见此 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 # -*- coding: utf-8 -*- """ author: Administ…

实用调试技巧(1)

文章目录 目录1. 什么是bug&#xff1f;2. 调试是什么&#xff1f;有多重要&#xff1f;2.1 调试是什么&#xff1f;2.2 调试的基本步骤2.3 Debug和Release的介绍 3. Windows环境调试介绍3.1 调试环境的准备3.2 学会快捷键3.3 调试的时候查看程序当前信息3.3.1 查看临时变量的值…

身为程序员,你有哪些提高写代码效率的工具?

首先&#xff0c;每个程序员都是会利用工具的人&#xff0c;也有自己囊里私藏的好物。独乐乐不如众乐乐&#xff0c;今天笔者整理了3个辅助我们写代码的黑科技&#xff0c;仅供参考。如果你有更好的工具&#xff0c;欢迎评论区分享。 1、Google/Stackoverflow——搜索解决方案的…

作为Android 开发,该如何写好自己的简历……

不管在那个行业、那家公司、那个岗位&#xff0c;你去应聘面试&#xff0c;首先人家第一眼看的肯定是你的简历&#xff0c;先通过简历来初步判断你的能力&#xff0c;再到通知面试进行考察。所以简历是一张很重要牌&#xff0c;就看你怎么打了&#xff1f; 笔者本科毕业&#…

Vue2向Vue3过度Vuex核心概念mutations

目录 1 核心概念-mutations1.定义mutations2.格式说明3.组件中提交 mutations4.练习5.总结 2 带参数的 mutations1.目标&#xff1a;2.语法2.1 提供mutation函数&#xff08;带参数&#xff09;2.2 提交mutation 3 练习-mutations的减法功能1.步骤2.代码实现 4 练习-Vuex中的值…

EXSI技术--Exsi简介与安装

1.EXSI简介 了解可直接安装到您的物理服务器的、可靠的裸机 Hypervisor。通过直接访问并控制底层资源,VMware ESXi可有效地对硬件进行分区,以便整合应用并降低成本。它是业界领先的高效体系架构,在可靠性、性能和支持方面树立了行业标杆。(裸金属架构) VMware vSphere的虚拟…

Python科研绘图--Task05

目录 SciencePlots 安装SciencePlots 安装LaTeX ① 安装 MikTex 和 Ghostscript ② 将软件的安装路径添加到系统环境变量中 SciencePlots 绘图示例 SciencePlots 虽然 Matplotlib 或 ProPlot 库能够绘制出插图结果&#xff0c;但用户还需要根据期刊的配图绘制要求进行…

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄

Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发&#xff1a;Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统&#xff0c;我还是写一下以便将来用到或参考&#xff5e; 了解 安装Ubuntu22.04&#xff08;截至2023年08月26日11&#xff…

打开软件报错mfc100u.dll缺失是什么意思?简单式修复mfc100u.dll问题

首先&#xff0c;我们需要了解什么是MFC100U.dll文件以及它的作用。MFC100U.dll是一个Microsoft Foundation Class (MFC)库文件&#xff0c;它是Visual C应用程序开发的一部分。MFC库提供了许多通用的功能&#xff0c;如窗口管理、消息处理等&#xff0c;可以帮助开发者更快速地…

CC++ 常用技巧

C 中的C C 是面向过程的是把整个大程序分为一个个的子函数&#xff1b;C 是面向对象的是把整个程序划分为一个个的类。C 是完全兼容C 的&#xff0c;C 是C 的子集&#xff0c;C 是C 的超集。C 又对C 做了很多补充和提升&#xff0c;因此使用C 会比使用纯C 更方便。混用C和C&am…

springboot的mybatis问题

自动映射 在数据库列名和java类属性名相同的情况&#xff0c;mybatis会自动将数据库的值自动匹配到java类的属性当中。 java的price等变量 mysql的price等字段 mybatis会自动将数据库的值自动匹配到java类的属性当中。 开启驼峰命名 在application中配置 mybatis:type-…

【JVM基础】JVM入门基础

目录 JVM的位置三种 JVMJVM体系结构类加载器双亲委派机制概念例子作用 沙箱安全机制组成沙箱的基本组件 NativeJNI&#xff1a;Java Native Interface&#xff08;本地方法接口&#xff09;Native Method Stack&#xff08;本地方法栈&#xff09; PC寄存器&#xff08;Program…

paddleclas ImportError: cannot import name ‘Identity‘ from ‘paddle.nn‘

使用paddlepaddle的 paddleclas 官方demos时 &#xff0c;报错如图 ImportError: cannot import name ‘Identity’ from ‘paddle.nn’ 解决方案很简单&#xff1a; 找到调用 Identity 的位置&#xff1a; 注释掉就解决啦 !!! 搞定&#xff01;&#xff01;&#xff01;…

树与图c++

1.树 前言 本文主要介绍的数据结构之树型结构的相关知识&#xff0c;树型数据结构是面试官面试的时候非常喜欢考的一种数据结构&#xff0c;树形结构的遍历也是大厂笔试非常喜欢设置的考点&#xff0c;这些内容都会在本篇文章中进行详细的介绍&#xff0c;并且还会介绍一些常…

QNAP(威联通)NAS外远程访问指南,免费内网穿透工具的应用和配置指导——“cpolar内网穿透”

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 前言 购入威联通NAS后&#xff0c;很多用户对于如何在外在公网环境下的远程访问威联通NAS…

Rufus制作u盘 启动工具

下载U盘系统盘制作工具Rufus 官网&#xff1a;http://rufus.ie/zh/ 下载地址&#xff1a;https://github.com/pbatard/rufus/releases/download/v3.18/rufus-3.18.exe 制作u盘 双击运行 选择识别打的u盘 点击选择按钮&#xff0c;选择镜像 点击开始 等待安装完成

一文了解Gin对Cookie的支持z

1. 引言 本文将从Web应用程序处理请求时需要用户信息&#xff0c;同时HTTP又是无状态协议这个矛盾点出发。从该问题出发&#xff0c;简单描述了解决该问题的Token 机制&#xff0c;进而引出Cookie的实现方案。 基于此我们将详细描述Cookie的规范&#xff0c;然后详细描述具体…

electron+vue3全家桶+vite项目搭建【16.1】electron多窗口,pinia状态同步,扩展store方法,主动同步pinia的状态【推荐】

文章目录 引入实现效果如下实现步骤1.自定义pinia插件2.主进程补充同步处理 引入 demo项目地址 我们之前写了一个自动同步pinia状态的插件&#xff0c;可以参考如下文章 electronvue3全家桶vite项目搭建【16】electron多窗口&#xff0c;pinia状态无法同步更新问题解决 这里…

vue 简单实验 v-for 循环

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"list-rendering"><ol><li v-for"todo in todos">{{ todo.text }}</li></ol> </div> &…