题目:
对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。
思路:
思路源于“x86(大雪)”。
设置一个辅助栈,用于存储当前栈中min元素。
push的时候,如果元素小于辅助栈top,则元素入辅助栈。
pop的时候,如果pop后主栈的top大于辅助栈top,则辅助栈pop。
程序(和上边思路稍有出入):
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
template< class T >
class GoogleStack
{
public:
GoogleStack()
{
}
void push(const T& t)
{
m_mainStack.push(t);
if (m_assistantStack.empty() || t < m_assistantStack.top())
{
m_assistantStack.push(t);
}
else if (t > m_assistantStack.top())
{
T min = m_assistantStack.top();
m_assistantStack.pop();
m_assistantStack.push(t);
m_assistantStack.push(min);
}
}
void pop()
{
if (m_mainStack.top() == m_assistantStack.top())
{
m_assistantStack.pop();
}
else
{
T min = m_assistantStack.top();
m_assistantStack.pop();
m_assistantStack.pop();
m_assistantStack.push(min);
}
m_mainStack.pop();
}
const T& min() const
{
return m_assistantStack.top();
}
bool empty() const
{
return m_mainStack.empty();
}
const T& top() const
{
return m_mainStack.top();
}
private:
stack< T > m_mainStack;
stack< T > m_assistantStack;
};
int main()
{
vector< int > data;
data.push_back(7);
data.push_back(6);
data.push_back(5);
data.push_back(1);
data.push_back(4);
GoogleStack< int > gStack;
for (vector< int >::iterator i = data.begin(); i != data.end(); ++i)
{
gStack.push(*i);
}
while (!gStack.empty())
{
cout << "pop : " << gStack.top() << ", min : " << gStack.min() << endl;
gStack.pop();
}
}