【转】面试题:实现一个队列,这个队列除了有EnQueue, DeQueue操作,还有一个Max操作,三个操作复杂度都是O(1)
1.每次 新元素进栈的时候,栈里面的元素需要排序
2.让最小的或者最大的元素位于栈顶,这样就可以在O(1)时间内获得最小或者最大的值了,
------
3.上面的想法 不能保证,进栈(进了队列)之后 ,出去的元素的顺序,因此只有一个栈是不行的
4.要有个保存最小或者最大的元素,每次进栈的时候,跟这个数比较,存起来,
---------------
5.但是有个问题,就是你最大的元素(或者最小的元素出去)了之后,你该怎么去更新这个值呢,
6.就是只 维持一个变量是不够的
7.最小元素或者最大元素出栈之后,要能够保证次小元素立马填补现在这个位置
--------
也就是说,我们需要把次小元素和最小元素都保存起来,放到另外的一个辅助栈里面,
--------------
举例子
1. 进栈3 数据是3 辅助栈3 最小值3
2. 进栈4 数据是3,4 辅助栈是3,3 最小值3
3. 进栈2 数据是3,4,2 辅助栈3,3,2 最小值2
4. 进栈1 数据是3,4,2,1 辅助栈3,3,2,1 最小值1
5. 弹出 数据是3,4,2 辅助栈是3,3,2 最小值是2
6 弹出 数据是3,4, 辅助栈是3,3, 最小值是3
7 进栈0 数据是3,4,0 辅助栈是3,3,0 最小值0
每次把最小的栈压入辅助栈,就能保证栈顶的辅助元素一直是最小的数
问题就是 当我弹出的时候,辅助栈也要跟着弹出一个数才可以
代码就是:
1.进栈
数据 value 进入数据栈,
判断辅助栈
如果辅助栈为空,或者辅助栈的栈顶元素比 value大,就把value压如辅助栈,
否则就把 辅助栈的栈顶元素 重复压入 辅助栈里面
//要保证 数据栈和辅助栈的元素个数一致
2.弹出
数据栈不能为空,辅助栈也不能为空
数据栈弹出
辅助栈弹出
3.求最大值或者最小值
数据栈不能为空,辅助栈也不能为空,
直接返回 辅助栈的top元素
【转】面试题:实现一个队列,这个队列除了有EnQueue, DeQueue操作,还有一个Max操作,三个操作复杂度都是O(1)的更多相关文章
- 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列
因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...
- 面试题:使用LinkedList来模拟一个堆栈或者队列数据结构
请使用LinkedList来模拟一个堆栈或者队列数据结构. 堆栈:先进后出 First In Last Out (FILO) 队列:先进先出 First In First Out (FIFO) 我 ...
- java 使用LinkedList模拟一个堆栈或者队列数据结构
近期在复习下java基础,看了下java基础,在看到集合时突然发现想起来曾经面试有一道笔试题:模拟一个堆栈或者队列数据结构,当时还没做出来,今天就写一下,首先得明确堆栈和队列的数据结构 堆栈:先进后出 ...
- 使用LinkedList模拟一个堆栈或者队列数据结构
使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 如同一个水管. import java.util.LinkedList; public cl ...
- 使用Condition Variables 实现一个线程安全队列
使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...
- C# 模拟一个处理消息队列的线程类 Message Queue
// 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...
- java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。
/* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import jav ...
- Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。
package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...
- 【IT笔试面试题整理】堆栈和队列
如何准备: Whether you are asked to implement a simple stack / queue, or you are asked to implementa modi ...
- 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬
消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL, ...
随机推荐
- 吴丽丽-201871010123《面向对象程序设计(Java)》第七周学习总结
吴丽丽-201871010123<面向对象程序设计(Java)>第七周学习总结 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个 ...
- pyenv python 多版本管理工具
pyenv fork 自rbenv 以及ruby-build ,然后修改为转为python 使用 venv 以及virtualenv 解决了版本选择的问题,pyenv 同时为我们解决 了python ...
- 支持TV远程控制的WIN10PEX64_17763网络版by双心
支持TV远程控制的WIN10PEX64_17763网络版by双心 用slore大神的wimbuilder2,基于cn_windows_10_enterprise_ltsc_2019_x64_dvd_9 ...
- 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...
- CF1178F Short/Long Colorful Strip(DP)
说起来,这题好像也不难-- 先考虑 F1 怎么做. 既然别的方法都不行不如试试\(f_{i,j}\) 表示在刚刚准备开始涂 \([i,j]\) 中最小编号的颜色之前,整个区间是同色的,且最后能做到 \ ...
- Linux性能优化实战学习笔记:第四十九讲
一.上节回顾 上一期,我们一起梳理了,网络时不时丢包的分析定位和优化方法.先简单回顾一下.网络丢包,通常会带来严重的性能下降,特别是对 TCP 来说,丢包通常意味着网络拥塞和重传,进而会导致网络延迟增 ...
- Linux性能优化实战学习笔记:第五十讲
一.上节回顾 上一节,我以 ksoftirqd CPU 使用率高的问题为例,带你一起学习了内核线程 CPU 使用率高时的分析方法.先简单回顾一下. 当碰到内核线程的资源使用异常时,很多常用的进程级性能 ...
- copy running-config startup-config 与 copy startup-config running-config
1.copy running-config startup-config 与 copy startup-config running-config 两者有什么不同???ANS:running-conf ...
- SWIG 3 中文手册——4. 脚本语言
目录 4 脚本语言 4.1 两种语言的概览 4.2 脚本语言如何调用 C? 4.2.1 包装器函数 4.2.2 变量链接 4.2.3 常量 4.2.4 结构体与类 4.2.5 代理类 4.3 构建脚本 ...
- PDF提取图片(错误纠正)
有个任务需要抽取pdf中的图片,于是找了一个例子但是有错误,仅此记录下 错误1. AttributeError: 'Document' object has no attribute 'getObje ...