标签:数据结构
题目:
假设有这样一个拥有三个操作的队列:
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