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)的更多相关文章

  1. 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列

    因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...

  2. 面试题:使用LinkedList来模拟一个堆栈或者队列数据结构

    请使用LinkedList来模拟一个堆栈或者队列数据结构. 堆栈:先进后出 First In Last Out  (FILO) 队列:先进先出 First In First Out  (FIFO) 我 ...

  3. java 使用LinkedList模拟一个堆栈或者队列数据结构

    近期在复习下java基础,看了下java基础,在看到集合时突然发现想起来曾经面试有一道笔试题:模拟一个堆栈或者队列数据结构,当时还没做出来,今天就写一下,首先得明确堆栈和队列的数据结构 堆栈:先进后出 ...

  4. 使用LinkedList模拟一个堆栈或者队列数据结构

    使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public cl ...

  5. 使用Condition Variables 实现一个线程安全队列

    使用Condition Variables实现一个线程安全队列 测试机: i7-4800MQ .7GHz, logical core, physical core, 8G memory, 256GB ...

  6. C# 模拟一个处理消息队列的线程类 Message Queue

    // 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...

  7. java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

    /* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import jav ...

  8. Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。

    package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...

  9. 【IT笔试面试题整理】堆栈和队列

    如何准备: Whether you are asked to implement a simple stack / queue, or you are asked to implementa modi ...

  10. 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬

    消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL, ...

随机推荐

  1. 201871010128-杨丽霞《面向对象程序设计(Java)》第十一周学习总结

    201871010128-杨丽霞<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  2. 用eclipse开发Android,用Genymotion测试时报错adb发生错误

    每当我要运行安卓程序时,控制台就会报出 The connection to adb is down, and a severe error has occured. You must restart  ...

  3. 接口规范、容错处理规则、aph备份数据规则

    前话:前后解耦,前端开发环节使用APH,后台开发环节postman(可考虑为后台也做一个aph后台版) 1.api标准:标识符(ret:1为正常数据,0为接口报错),数据体(data:api的数据容器 ...

  4. 初赛Part2

    初赛 时间复杂度 主定理(必考) \[ T(n) = aT(\frac{n}{b})+f(n) \] 其中,\(n\)为问题的规模,\(a\)为递推下子问题的数量,\(\frac{n}{b}\)为每个 ...

  5. linux翻页及字符串搜索操作

    向下翻动一屏幕: space, ctrl + f, ctrl + v, ctrl + F 向下翻动半屏: d, ctrl + D 向下翻动一行: 回车, e, j 向上翻动一屏幕: b, ctrl + ...

  6. 【CF1097F】Alex and a TV Show

    [CF1097F]Alex and a TV Show 题面 洛谷 题解 我们对于某个集合中的每个\(i\),令\(f(i)\)表示\(i\)作为约数出现次数的奇偶性. 因为只要因为奇偶性只有\(0, ...

  7. js数组检测

    数组检测 检测constructor v.constructor === Array 缺点: let arr = [] console.log(arr.constructor === Array); ...

  8. 热情组——项目冲刺 Day3

    项目相关 作业相关 具体描述 班级 班级链接 作业要求 链接地址 团队名称 热情组 作业目标 实现软件制作,以及在福大的传播 Github链接 链接地址 SCRUM部分: 成员昵称 昨日目标 开始时间 ...

  9. 2018-2019-2 20162329 《网络对抗技术》Exp8: Web基础

    目录 Exp8: Web基础 一. 基础问题回答 1. 什么是表单 2. 浏览器可以解析运行什么语言. 3. WebServer支持哪些动态语言 二. 实验过程 1. Web前端HTML 2..Web ...

  10. 基于Kafka的实时计算引擎如何选择?Flink or Spark?

    1.前言 目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟.以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象.那么,今天就来聊一聊基于Kafka的实时计算引 ...