实现原理:

1、利用Stack的先进后出的特性,实现一个MaxStack,MaxStack中用一个Stack记录当前的值,一个Stack记录当前的最大值。

2、用2个MaxStack实现MaxQueue,其中一个MaxStack记录出栈记录,一个MaxStack记录入栈记录,取2个MaxStack中的最大值作为当前MaxQueue的最大值。

 using System;
using System.Data;
using System.Collections;
using System.Collections.Generic; namespace HelloWorld
{
public class MaxStack<T>
{
private Stack<T> data;
private Stack<T> maxStack; public MaxStack()
{
data = new Stack<T>();
maxStack = new Stack<T>();
} public void Push(T element)
{
if (data.Count == )
{
data.Push(element);
maxStack.Push(element);
}
else
{
var current = maxStack.Peek();
var compare = Comparer<T>.Default;
if (compare.Compare(current, element) < )
{
maxStack.Push(element);
}
data.Push(element);
}
} public T Pop()
{
if (this.IsEmpty)
throw new Exception("Queue is empty.");
else
{
var current = data.Pop();
var compare = Comparer<T>.Default;
if (compare.Compare(current, maxStack.Peek()) == )
{
maxStack.Pop();
}
return current;
}
} public bool IsEmpty
{
get
{
return data.Count == ;
}
} public T GetMax()
{
if (maxStack.Count > )
return maxStack.Peek();
else
return default(T);
}
}
}
 using System;
using System.Data;
using System.Collections;
using System.Collections.Generic; namespace HelloWorld
{
public class MaxQueue<T>
{
private MaxStack<T> popStack;
private MaxStack<T> pushStack;
public MaxQueue()
{
popStack = new MaxStack<T>();
pushStack = new MaxStack<T>();
} public void Enqueue(T element)
{
pushStack.Push(element);
} public T Dequeue()
{
if (popStack.IsEmpty && pushStack.IsEmpty)
throw new Exception("Queue is empty.");
if (popStack.IsEmpty)
{
while (!pushStack.IsEmpty)
{
var element = pushStack.Pop();
popStack.Push(element);
}
}
return popStack.Pop();
} public T GetMax()
{
Comparer comparer = Comparer.Default;
if (comparer.Compare(popStack.GetMax(), pushStack.GetMax()) > )
{
return popStack.GetMax();
}
else
{
return pushStack.GetMax();
}
}
}
}
 using System;
using System.Text; namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
MaxQueueTest();
} static void MaxQueueTest()
{
MaxQueue<int> queue = new MaxQueue<int>();
SELECT:
var selected = ShowMenu();
switch (selected)
{
case "":
Console.Write("请输入入队值(int):");
var value = Console.ReadLine();
int v = ;
if (int.TryParse(value, out v))
{
queue.Enqueue(v);
Console.WriteLine("输入入队值:{0}后,,当前最大值为:{1}", value,queue.GetMax());
}
goto SELECT;
case "":
try
{
var element = queue.Dequeue();
Console.WriteLine("出队值:{0},当前最大值为:{1}",element,queue.GetMax());
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
goto SELECT;
case "":
break;
default:
Console.WriteLine("输入有误,请重新选择。");
goto SELECT;
}
} static string ShowMenu()
{
MaxQueue<int> queue = new MaxQueue<int>();
Console.WriteLine("*****************************************");
Console.WriteLine("1、入队");
Console.WriteLine("2、出队");
Console.WriteLine("3、退出");
Console.WriteLine("*****************************************");
Console.Write("请选择:");
var selected = Console.ReadLine();
return selected;
}
}
}

O(1)取Queue中的最大值的更多相关文章

  1. 关于取表中id最大值+1的select语句,哪种效率更高?

    需求:取stock表中id最大值+1,作为下一个id值. 特殊情况:考虑到表中会没有值,max(id)会返回空,因此需要用case when进行判断. 实现一:select (case max(id) ...

  2. 转载——JavaScript学习笔记:取数组中最大值和最小值

    转载自:http://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html. 取数组中最大值 可以先把思路 ...

  3. JavaScript学习:取数组中最大值和最小值

    在实际业务中有的时候要取出数组中的最大值或最小值.但在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最 ...

  4. 个人学习记录--取表中Name相同的最大值,非Group By,可延伸

    ), qy ), je INT); INSERT INTO @t SELECT '产品一', '北京', UNION ALL SELECT '产品一', '上海', UNION ALL SELECT ...

  5. Excel中提取最大值的问题

    在使用excel的时候,碰到了一个如下的问题 意思是以每个字母为条件,取这个字母下面的数字中的最大值,需要注意一个问题是每个字母下面的数字个数不一定相等,例如d下面有四个数字,可以设置如下公式解决: ...

  6. 查找n个数字中的最大值

    闲来无事,试试用arg_list查找n个数字中的最大者. 又因为本人喜欢模板, 所以就早早的写了以下代码, 没有经过严格测试. /*********************************** ...

  7. 保留键的情况下取字典中最大的值(max\zip函数的联合使用)

    在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age ...

  8. 一个自定义python分布式专用爬虫框架。支持断点爬取和确保消息100%不丢失,哪怕是在爬取进行中随意关停和随意对电脑断电。

    0.此框架只能用于爬虫,由框架来调度url请求,必须按照此方式开发,没有做到类似celery的通用分布式功能,也不方便测试.可以使用另外一个,基于函数式编程的,调度一切函数的分布式框架,做到了兼容任何 ...

  9. Java 抓取网页中的内容【持续更新】

    背景:前几天复习Java的时候看到URL类,当时就想写个小程序试试,迫于考试没有动手,今天写了下,感觉还不错 内容1. 抓取网页中的URL 知识点:Java URL+ 正则表达式 import jav ...

随机推荐

  1. [转]自用类库整理之SqlHelper和MySqlHelper

    本文转自:http://www.cnblogs.com/lzrabbit/p/3287155.html 自用的SQLHelper和MySqlHelper,除一些通用方法外,封装了一些很实用的批量操作方 ...

  2. lumisoft会将eml后缀格式的附件给解析成文本,这里保存成文件

    MIME_Entity[] attachments = mime.Attachments; foreach (MIME_Entity entity in attachments) { string f ...

  3. 如何判断两个IP是否在同一网段

    下来举例说明,如何去判断A和B两个IP是否在同一网段. A IP:202.194.128.9 B IP:202.194.128.14 子网掩码:255.255.255.0 1.把A和B的地址转换为二进 ...

  4. AWK 怎么读取标准输入(STDIN)

    在 awk 系列中,我们将会看到几个例子,你可以筛选其他命令的输出代替从一个文件读取输入作为 awk 的输入.我们首先从使用 dir 命令开始,它类似于 ls 命令. 在第一个例子下面,我们使用 di ...

  5. [Functional Programming Monad] Combine Stateful Computations Using Composition

    We explore a means to represent the combination of our stateful computations using familiar composit ...

  6. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat等使用详解

    转载:http://blog.csdn.net/tzs_1041218129/article/details/61630981 javap 和 javac javap -help javac -hel ...

  7. FastIV图像处理

    新建一图像处理算法群,主要讨论图像处理与计算机视觉中的快速算法及其工程实现. 群号码:322687422

  8. kubernetes 部署SonarQube 7.1 关联LDAP

    之前有写过一篇如何在kubernetes上部署SonarQube的文档, 然后由于客户的需求,需要SonarQube关联LDAP的用户, 于是今天花了半天时间研究了以下如何在原有的基础上安装LDAP插 ...

  9. 我如何向HRMM介绍MICROSERVICE

    一天我司招才猫姐(HR 大人)问我,你给我解释一下 Microservice 是什么吧.故成此文.一切都是从一个创业公司开始的. 第一章:从集中到分权 最近的创业潮非常火爆,我禁不住诱惑也掺和了进去, ...

  10. npm技巧

    你看一个同事正在编码,其中应用上了一些简写和技巧,不知为何,你不熟悉它并且你的大脑一片混乱,这种场景发生在过去我们每个人身上. 在这篇短文中,我们将会介绍一些非常实用的 npm 技巧.有很多文章中的技 ...