剑指offer第6题:使用两个栈实现队列
时间:2022-07-22
本文章向大家介绍剑指offer第6题:使用两个栈实现队列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
用两个栈实现队列
剑指Offer 09:用两个栈实现队列
题目描述
解法:
对于这种数据结构的实现类题目,出题者的意图主要还是想让我们对这种数据结构具有深刻的了解。对于栈而言,具有先进后出的特点,而对于队列而言,具有先进先出的特点。所以根据这些特点我们来分析此题。
栈的特点是先进后出,当我们对栈进行两次push
和pop
的操作之后,那么第二次push
之后的顺序就是对比第一次的顺序就是先进先出的顺序了。利用两个栈,主要的目的就是让我们倒腾两次,让先进的元素最后放在栈顶,后进的元素放在栈底。
所以我们可以设置两个栈,第一个栈主要用来push
数据,所有先进来的元素都会被放在栈底。当我们需要获取头元素的时候,我们先从第一个栈中把所有的元素都pop
到第二个栈中。这样我们的第二个栈就恢复到了初始push
值的顺序了。我们直接从第二个栈中pop
出栈顶元素,即为第一次加入到队列中的元素。
代码实现:
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(stack2.size()!=0) return stack2.pop();//优先从stack2中弹出值
while(stack1.size()!=0){//将stack1中的值全部压入到stack2中,保证stack2中的弹出顺序是stack1中的压入顺序
stack2.push(stack1.pop());
}
return stack2.size() == 0 ? -1 : stack2.pop();
}
【注意】顺便提一句,这道题虽然很简单,但是在小白一面百度
的时候,面试官最后一道题就是这道题,没有让小白手撕代码,直接说思路即可。所以希望看到这篇文章的小伙伴能够好好理解一下这道题目的思路。
【拓展】
在这道题中,还是让我们熟悉队列与栈的特点。在LeetCode上面的第225题是使用两个队列来完成一个栈的功能。有兴趣的小伙伴儿可以看一下!链接在下面哈~
https://leetcode-cn.com/problems/implement-stack-using-queues/
- apache反向代理一、泛解析域名二、APACHE配置
- Python学习 - 可视化变量赋值、循环、程序运行过程
- jdk源码分析红黑树——插入篇1.插入root2.父黑3.父红4.父红,叔红5.1父红,叔黑,外侧子孙5.2父红,叔黑,内侧子孙
- WIFI环境下Android手机和电脑通信
- 破解之美:利用ECB加密缺陷突破cookie加密
- 让Python猜猜你是否能约会成功
- python学习笔记之初识Python
- 从APK解密到批量获取他人信息
- React native和原生之间的通信
- 移动云存储服务平台Parse下的iOS安全分析
- 经典算法学习之回溯法
- 渗透测试系统BackBox Linux 4.1发布
- CMS漏洞检测工具 - CMSmap
- 基因组分析中多物种同源基因的鉴定和筛选
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centreon+Nagios实战第四篇——监控端安装NDOUtils
- python自学成才之路 类属性和实例属性,__slots__方法
- 算法初步 基本概念 最大子数组和
- Oracle数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名详解
- Maven实战之旅第六篇——maven常用指令
- maven实战之旅第四篇——利用maven archetype手动建立一个maven项目
- 一起刷 leetcode 之旋转矩阵
- exe调用DLL的方式
- 聊聊claudb的DatabaseCleaner
- Stata | 排名转为得分
- kafka使用avro序列化和反序列化
- avro使用schema生成java文件
- zabbix_sender安装和使用
- zabbix_get安装和使用
- rabbitmq搭建集群踩坑记