【算法专题--栈】用队列实现栈 -- 高频面试题(图文详解,小白一看就懂!!)

devtools/2024/9/24 0:25:19/

目录

一、前言

二、题目描述

三、解题方法

⭐两个队列实现栈

🥝解题思路

🍍案例图解

⭐用一个队列实现栈 

🍇解题思路

🍍案例图解

四、总结与提炼

五、共勉    


一、前言

        用队列实现栈 这道题,可以说是--栈专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
       本片博客就来详细的讲讲解一下 用队列实现栈 的实现方法,让我们的面试变的更加顺利!!!

二、题目描述

题目链接: 225. 用队列实现栈 - 力扣(LeetCode)

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

 三、解题方法

首先,需要了解一下,栈 和 队列基本概念  

⭐两个队列实现栈

🥝解题思路

两个队列 que1 que2 实现 的功能que2 其实完全就是一个备份的作用,把 que1除最后一个元素外的其它元素全部备份到 que2 中,然后弹出最后面的元素,再把其他元素从que2 导回 que1。

干涩的语言可能让大家不太好理解,我们在来看一下 详细的图解

🍍案例图解

 模拟的队列执行语句如下:

queue.push(1);        
queue.push(2);        
queue.pop();   // 注意弹出的操作       
queue.push(3);        
queue.push(4);       
queue.pop();  // 注意弹出的操作    
queue.pop();    
queue.pop();    
queue.empty();    
  • 首先,向 que1 中  入队列元素 【1】【2】 ,模拟元素入栈

  • 将 que1 中除队尾元素外 的其它元素,转移到 que2,在移除 que1 中的元素【2】 

  •  移除 que1 中的元素【2】 ,将 que1 赋值给 que2 ,模拟 移除 栈顶元素

  •  继续 向 que1 中入队列元素 【3】【4】,模拟入栈

  • 模拟 栈 的 pop 删掉元素 【4】【3】【1】,和之前的步骤一样,将【4】之前的元素,转移到 que2 中

  •  删除元素【4】,再将 que2 赋值给 que1 ,清空 que2

  • 按照 同样的思路 删除 【3】【1】 

 代码:

class MyStack {
public:MyStack() {// 程序自己创建构造函数进行初始化}void push(int x)  // 入队列 {que1.push(x);}int pop()  // 出队列 {int size = que1.size();size--;while(size--)   // 将 que1 导入 que2 ,但是要留下最后一个元素{que2.push(que1.front());que1.pop();}int result = que1.front();  // 留下的最后一个元素就是要返回的元素que1.pop();que1 = que2;        // 在将 que2 赋值给 que1// 清空 que2while(!que2.empty()){que2.pop();}return result;}int top() // 取 队顶 {return que1.back();}bool empty() // 判断队列是否为空 {return que1.empty();}
private:queue<int> que1;queue<int> que2;
};

⭐用一个队列实现栈 

🍇解题思路

其实这道题目就是用一个队列就够了。 

一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。 

🍍案例图解

queue.push(1);        
queue.push(2);        
queue.pop();   // 注意弹出的操作 
queue.pop();

 模拟的队列执行语句如上:

  •  向  队列 中插入 元素【1】【2】,模拟入栈

  • 删除元素【2】,将元素【1】出队列,然后再重新入队列 

  •  将元素【2】出队列即可 ,模拟栈 删除元素【2】

  • 删除 元素【1】同理 


代码: 

class MyStack {
public:MyStack() {// 程序自己创建构造函数进行初始化}void push(int x)  // 入队列 {que.push(x);}int pop()  // 出队列 {int size = que.size();size--;                 // 保留最后一个元素while(size--){que.push(que.front());que.pop();}int result = que.front();que.pop();return result;}int top() // 取 队顶 {return que.back();}bool empty() // 判断队列是否为空 {return que.empty();}
private:queue<int> que;
};


四、总结与提炼

        最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关 用队列实现栈 的题目,这道题目是校招笔试面试中有关栈章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握 !! 

五、共勉    

以下就是我对 用队列实现栈 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 栈专题 的理解,请持续关注我哦!!!  


http://www.ppmy.cn/devtools/56570.html

相关文章

python基础:操作字典

1、遍历整个字典的键-值对 items()方法返回一个键-值对列表&#xff0c;for 循环依次将每个键—值对存储到指定的两个变量中。 使用元组和列表遍历方法遍历字典&#xff1a; user_0 { username: efermi, first: enrico, last: fermi, } for key, value in user_0.items():p…

element 问题整合

没关系&#xff0c;凡事发生必有利于我 文章目录 一、el-table 同级数据对齐及展开图标的位置问题二、el-table 勾选框为圆角及只能勾选一个三、el-tree 弹框打开&#xff0c;使得列表关闭&#xff0c;且弹框滚动条回到顶部 一、el-table 同级数据对齐及展开图标的位置问题 ele…

关于几种熵的计算(MATLAB)

Shannon在1948年定义了信息熵&#xff0c;并用信息熵来衡量一个事件的不确定程度。作为信息论中一个重要的基本概念&#xff0c;信息就是一种客观存在和能动的过程&#xff0c;它可以减少或者消除事件的不确定因素。一切客观事物的属性中都包含着不确定性&#xff0c;人们在没有…

《Windows API每日一练》6.3 非客户区鼠标消息

上一节我们讨论客户区的鼠标消息&#xff0c;本节我们讨论非客户区鼠标消息。如果鼠标位于窗口内部除客户区外的其他区域&#xff0c;Windows就会向窗口过程发送一个“非客户区”鼠标消息。窗口的非客户区包括标题栏、菜单和窗口滚动条。 本节必须掌握的知识点&#xff1a; 非…

【Android】App设置开机自启动之后但是无效的原因之一

问题描述 通过监听开机广播&#xff0c;然后启动App&#xff0c;但是在系统开机之后&#xff0c;App并没有启动。 问题原因 当一个App在安装之后&#xff0c;必须要先启动一次&#xff0c;然后这个开机启动的功能才可以正常使用。 但是由于我的这个App是一个服务类的App&am…

PHP框架中的模型:核心组件解析

引言 PHP框架作为现代Web开发的强大工具&#xff0c;极大地提高了开发效率和应用质量。在众多PHP框架中&#xff0c;模型&#xff08;Model&#xff09;扮演着至关重要的角色。本文将深入探讨模型在PHP框架中的作用、重要性以及它如何与其他组件协同工作。 什么是模型&#x…

win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南

Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南 一、修改Windows 10远程桌面端口 在Windows 10系统中&#xff0c;远程桌面连接默认使用3389端口。为了安全起见&#xff0c;建议修改此端口以减少潜在的安全风险。以下是修改远程桌面端口的步骤&#xff1a; 1. 打…

基于SpringBoot漫画网站系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…