题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push 及 pop 的时间复杂度都是 O(1)
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template <typename T> class stack_with_min
{
public:
T min();
void push(const T & item);
void pop();
stack_with_min(){}
~stack_with_min(){}
private:
stack<T> data_stack; // 用于存放栈数据本身
stack<T> min_stack; // 辅助栈,存放当前栈最小元素
};
template <typename T> T stack_with_min<T>::min()
{
assert(!data_stack.empty() && !min_stack.empty());
return min_stack.top();
}
template <typename T> void stack_with_min<T>::push(const T & item)
{
data_stack.push(item);
// 处理辅助栈,压入当前栈最小元素
if( min_stack.empty() || item < min_stack.top() ) // 要先判空,否则会报错
min_stack.push(item);
else
min_stack.push(min_stack.top());
}
template <typename T> void stack_with_min<T>::pop()
{
assert(!data_stack.empty() && !min_stack.empty());
min_stack.pop();
data_stack.pop();
}