O(1)取Queue中的最大值
实现原理:
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中的最大值的更多相关文章
- 关于取表中id最大值+1的select语句,哪种效率更高?
需求:取stock表中id最大值+1,作为下一个id值. 特殊情况:考虑到表中会没有值,max(id)会返回空,因此需要用case when进行判断. 实现一:select (case max(id) ...
- 转载——JavaScript学习笔记:取数组中最大值和最小值
转载自:http://www.w3cplus.com/javascript/calculate-the-max-min-value-from-an-array.html. 取数组中最大值 可以先把思路 ...
- JavaScript学习:取数组中最大值和最小值
在实际业务中有的时候要取出数组中的最大值或最小值.但在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最 ...
- 个人学习记录--取表中Name相同的最大值,非Group By,可延伸
), qy ), je INT); INSERT INTO @t SELECT '产品一', '北京', UNION ALL SELECT '产品一', '上海', UNION ALL SELECT ...
- Excel中提取最大值的问题
在使用excel的时候,碰到了一个如下的问题 意思是以每个字母为条件,取这个字母下面的数字中的最大值,需要注意一个问题是每个字母下面的数字个数不一定相等,例如d下面有四个数字,可以设置如下公式解决: ...
- 查找n个数字中的最大值
闲来无事,试试用arg_list查找n个数字中的最大者. 又因为本人喜欢模板, 所以就早早的写了以下代码, 没有经过严格测试. /*********************************** ...
- 保留键的情况下取字典中最大的值(max\zip函数的联合使用)
在我们平常想要获取字典中value最大或者最小的值的时候,常常使用如下函数: testDict = {"age1":18,"age2":20,"age ...
- 一个自定义python分布式专用爬虫框架。支持断点爬取和确保消息100%不丢失,哪怕是在爬取进行中随意关停和随意对电脑断电。
0.此框架只能用于爬虫,由框架来调度url请求,必须按照此方式开发,没有做到类似celery的通用分布式功能,也不方便测试.可以使用另外一个,基于函数式编程的,调度一切函数的分布式框架,做到了兼容任何 ...
- Java 抓取网页中的内容【持续更新】
背景:前几天复习Java的时候看到URL类,当时就想写个小程序试试,迫于考试没有动手,今天写了下,感觉还不错 内容1. 抓取网页中的URL 知识点:Java URL+ 正则表达式 import jav ...
随机推荐
- Python自然语言处理资料库
1.LTP [1]- 语言技术平台(LTP) 提供包括中文分词.词性标注.命名实体识别.依存句法分析.语义角色标注等丰富. 高效.精准的自然语言处理技术.经过哈工大社会计算与信息检索研究中心 11 年 ...
- Spark Streaming资源动态分配和动态控制消费速率
本篇从二个方面讲解: 高级特性: 1.Spark Streaming资源动态分配 2.Spark Streaming动态控制消费速率 原理剖析,动态控制消费速率其后面存在一套理论,资源动态分配也有一套 ...
- WebService 之 WSDL详解
WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务 ...
- com.android.support冲突的解决办法
All com.android.support libraries must use the exact same version specification (mixing versions can ...
- Android studio及eclipse中的junit单元測试
转载请标明出处:http://blog.csdn.net/nmyangmo/article/details/51179106 前一段时间有人问我单元測试的相关内容,我稍作总结做日志例如以下: 由于我接 ...
- View设置宽高
public class ViewMeasuare extends View { public ViewMeasuare(Context context, AttributeSet attrs) { ...
- list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址
#define list_entry(ptr, type, member) \ ((type *)(() -> member))) 解释: 1 在0这个地址看做有一个虚拟的type类型的变量,那 ...
- CAS 与 无锁队列
http://coolshell.cn/articles/8239.html http://www.tuicool.com/articles/VZ3IBv http://blog.csdn.net/r ...
- java 有用的类库
import org.apache.commons.lang.StringUtils; 字符串库
- JavaScript 中的string 方法
创建string的方法 var str ="abc"; var str = new String("abc"); var str = String(" ...