码迷,mamicode.com
首页 > 其他好文 > 详细

队列中取最大值操作问题

时间:2015-05-07 08:58:46      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:数据结构

技术分享题目:


       假设有这样一个拥有三个操作的队列:

       1.EnQueue(v):将v加入队列中

       2.DeQueue:使队列中的队首元素删除并返回此元素

       3.MaxElement:返回队列中的最大元素

请设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。


技术分享解法一:

技术分享

技术分享解法二:

 技术分享

技术分享

技术分享解法三:

技术分享

class stack
{
public:
stack()
{
stackTop = -1;
maxStackItemIndex = -1;
}
void Push(Type x)
{
stackTop++;
if (stackTop >= MAXN)//超出栈的最大存储量
;
else
{
stackItem[stackTop] = x;
if (x > Max())
{
link2NextMaxItem[stackTop] = maxStackItemIndex;
maxStackItemIndex = stackTop;
}
else
link2NextMaxItem[stackTop] = -1;
}
}
Type Pop()
{
Type ret;
if (stackTop < 0);//已经没有元素了,所以不能pop
else
{
ret = stackItem[stackTop];
if (stackTop == maxStackItemIndex)
maxStackItemIndex = link2NextMaxItem[stackTop];
stackTop--;
}
return ret;
}
Type Max()
{
if (maxStackItemIndex >= 0)
return stackItem[maxStackItemIndex];
else
return -INF;
}
private:
Type stackItem[MAXN];
int stackTop;
int link2NextMaxItem[MAXN];
int maxStackItemIndex;
};

       这里,维护一个最大值的序列(link2NextMaxItem)来保证Max操作的时间复杂对为O(1),相当于用空间复杂度换取时间复杂度。

       考虑使用两个栈来实现一个队列,设为栈A和栈B

class Queue
{
public:
Type MaxValue(Type x, Type y)
{
if (x > y)
return x;
else return y;
}
Type Queue::Max()
{
return MaxValue(stackA.Max(), stackB.Max());
}
Insert2Queue(v)
{
stackB.push(v);
}
Type DeQueue()
{
if (stackA.empty())
{
While(!stackB.empty())
stackA.push(stackB.pop());
}
return stackA.pop();
}
private:
stack stackA;
stack stackB;
}

技术分享

队列中取最大值操作问题

标签:数据结构

原文地址:http://blog.csdn.net/wangfengfan1/article/details/45541005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!