您的位置:首页 > 编程语言

编程之美---队列中取最大值操作问题

2014-12-13 11:17 281 查看
如何快速获取队列中的最大值?

最简单的办法,用一个for循环遍历,复杂度为o(n).

解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素。

解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈。

class stack
{
public:
stack()
{
stackTop = -1;
maxItemIndex = -1;
}
void Push(int x)
{
stackTop ++;
if(stackTop >= MAXN)
;
else
{
items[stackTop]=x;
if(x>Max())
{
nextMaxItem[stackTop] = maxItemIndex;
maxItemIndex = stackTop;
}
else nextMaxItem[stackTop] = -1;
}
}
int Pop()
{
int x;
if(stackTop < 0) return -1;
else
{
x = items[stackTop];
if(stackTop == maxItemIndex)
{
maxItemIndex = nextMaxItem[stackTop];
}
stackTop--;
}
return x;
}
int Max()
{
if(maxItemIndex >= 0) return items[maxItemIndex];
else return -1;
}
bool empty()
{
return stackTop == -1;
}
private:
int items[MAXN];
int stackTop;
int nextMaxItem[MAXN];
int maxItemIndex;
};
class Queue
{
public:
void Enqueue(int x)
{
B.Push(x);
}
int Dequeue()
{
if(A.empty())
{
while(!B.empty())
{
A.Push(B.Pop());
}
}
return A.Pop();
}
int Max()
{
if(A.Max() >= B.Max()) return A.Max();
else return B.Max();
}
private:
stack A;
stack B;
};


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: