1、题目
设计定义一个新的栈数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1).
2、分析思路
思路1:
每次压入一个元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,这样就可以在O(1)时间得到最小元素。
缺点:不能保证最后压入栈的元素能够最先出栈,即已经不是栈这种数据结构了。
思路2:
考虑在栈中添加一个成语变量存放最小的元素。每次压入一个元素进栈的时候,如果该元素比最小的元素还要小,则更新最小元素。
如果当前最小元素被弹出栈了,如何得到下一个最小的元素呢?
思路3:
在原始栈中添加一个辅助栈,每次将一个新的元素压入栈的同时,将最小元素压入辅助栈中。一个例子:
3、参考代码
//Newstack.h
/*
设计一种新的栈的数据结构,在该类型中实现一个能够得到栈的最小元素的min函数。
在该栈中,调用min、push及pop的时间复杂度都是O(1).
*/
#include <iostream>
#include <stack>
using namespace std;
template<typename T>
class Newstack{
public:
Newstack();
void push(const T& value);
void pop();
T min();
private:
std::stack<T> m_data;
std::stack<T> m_min;
};
//Newstack.cpp
#include "Newstack.h"
#include <assert.h>
template<typename T>
void Newstack<T>::push(const T& value)
{
m_data.push(value);
if(m_min.size() == 0 || m_min.top()>value)
m_min.push(value);
else
m_min.push(m_min.top());
}
template<typename T>
void Newstack<T>::pop()
{
m_data.pop();
m_min.pop();
}
template<typename T>
T Newstack<T>::min()
{
assert(m_data.size()>0 && m_min.size()>0);
return m_min.top();
}