实现原理:

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. Python自然语言处理资料库

    1.LTP [1]- 语言技术平台(LTP) 提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角色标注等丰富. 高效.精准的自然语言处理技术.经过哈工大社会计算与信息检索研究中心 11 年 ...

  2. Spark Streaming资源动态分配和动态控制消费速率

    本篇从二个方面讲解: 高级特性: 1.Spark Streaming资源动态分配 2.Spark Streaming动态控制消费速率 原理剖析,动态控制消费速率其后面存在一套理论,资源动态分配也有一套 ...

  3. WebService 之 WSDL详解

    WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务 ...

  4. com.android.support冲突的解决办法

    All com.android.support libraries must use the exact same version specification (mixing versions can ...

  5. Android studio及eclipse中的junit单元測试

    转载请标明出处:http://blog.csdn.net/nmyangmo/article/details/51179106 前一段时间有人问我单元測试的相关内容,我稍作总结做日志例如以下: 由于我接 ...

  6. View设置宽高

    public class ViewMeasuare extends View { public ViewMeasuare(Context context, AttributeSet attrs) { ...

  7. list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址

    #define list_entry(ptr, type, member) \ ((type *)(() -> member))) 解释: 1 在0这个地址看做有一个虚拟的type类型的变量,那 ...

  8. CAS 与 无锁队列

    http://coolshell.cn/articles/8239.html http://www.tuicool.com/articles/VZ3IBv http://blog.csdn.net/r ...

  9. java 有用的类库

    import org.apache.commons.lang.StringUtils; 字符串库

  10. JavaScript 中的string 方法

    创建string的方法 var str ="abc"; var str = new String("abc"); var str = String(" ...