您的位置:首页 > 其它

队列中取最大值操作问题

2015-01-11 20:23 295 查看
《编程之美》第3.7节:队列中取最大值操作问题

问题:如何能够以最低的时间复杂度来取队列中的最大值?

解法:用两个能够在线性时间取最大值的栈来构造队列,从而能够在O(1)的时间复杂度内取得最大值。

代码如下:

#include<iostream>
#include<stack>
using namespace std;

class Stack
{
stack<int> s;
stack<int> maxValue;
public:
void push(int a)
{
s.push(a);
if(maxValue.empty() || maxValue.top()<=a)
maxValue.push(a);
}
void pop()
{
if(s.top()==maxValue.top())
maxValue.pop();
s.pop();
}
int maxVal()
{
if(maxValue.empty())
return INT_MIN;
else
return maxValue.top();
}
int top()
{return s.top();}
bool empty()
{return s.empty();}
};

class Queue
{
Stack A;
Stack B;
public:
int maxValue()
{
return max(A.maxVal(),B.maxVal());
}
void push(int a)
{
B.push(a);
}
void pop()
{
move();
A.pop();
}
int front()
{
move();
return A.top();
}
void move()
{
if(A.empty())
{
while(!B.empty())
{
A.push(B.top());
B.pop();
}
}
}
};

int main()
{
Queue q;
q.push(1);
q.push(3);
q.push(2);
cout<<q.maxValue()<<endl;
q.pop();
cout<<q.front()<<endl;
q.push(7);
q.push(6);
q.push(5);
cout<<q.maxValue()<<endl;

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: