题目描述:
实现一个栈数据结构,要求包含min()函数(返回当前栈中的最小元素,复杂度O(1)),同时还要有Push,Pop,Top函数且复杂度都是O(1)。
分析:
要实现min()函数,首先想到可以使用一个指针指向栈中最小元素,但是每当弹栈一次进行一次,最小值就有可能发生变化,倘若当前最小被弹出,那就需要找到次小值,此时使用一个指针的思路是不可行的。于是,可以使用一个辅助栈来记录最小元素,具体做法是:数据栈每压入一个元素,就与辅助栈的栈顶元素比较,若此元素更小那就将其也压入辅助栈,否则就将辅助栈的栈顶元素再次压入辅助栈(此做法的目的是使得辅助栈的元素个数与数据栈的元素个数一致)。
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template <typename T>
class StackWithMin
{
public:
const T& Min() const;
const T& Top() const;
void Pop();
void Push(const T& value);
bool IsEmpty()
private:
stack<T> m_data;
stack<T> m_min;
};
template <typename T>
const T& StackWithMin<T>::Min() const
{
assert(m_data.size() > 0 && m_min.size() > 0);
return m_min.top();
}
template <typename T>
const T& StackWithMin<T>::Top const
{
assert(m_data.size() > 0 && m_min.size() > 0);
return m_data.top();
}
template <typename T>
void StackWithMin<T>::Pop()
{
assert(m_data.size() > 0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
template <typename T>
void StackWithMin<T>::Push(const T& value)
{
m_data.push(value);
if(m_min.size() == 0 || value < m_min.top())
m_min.push(value);
else
m_min.push(m_min.top());
}
template <typename T>
bool StackWithMin<T>::IsEmpty()
{
if(m_data.size() == 0 || m_min.size() == 0)
return true;
else
return false;
}
int main()
{
StackWithMin myStack;
int array[] = {5, -8, 96, 0, 5, 3, -5, 793, -555, 96}
for(int i = 0; i < sizeof(array)/sizeof(int);i++)
{
myStack.Push(array[i]);
}
while(!myStack.IsEmpty())
{
cout << "top of dataStack is : " << myStack.Top() << ", min element is : " << myStack.Min() << endl;
myStack.Pop()
}
return 0;
}