题目:设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
main文件:代码
运行结果:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
文件分布:
头文件和main文件
头文件:代码
#include <stack>
#include <assert.h>
using namespace std;
template <typename T>
class stackWithMin{
private :
stack<T> m_data;
stack<T> m_min;
public:
stackWithMin(){}
virtual ~stackWithMin(){}
const T& top() ;
T& top() const;
void push(const T& value);
void pop();
const T& min() const;
bool empty() const ;
int size() const;
};
//入栈
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> void stackWithMin<T>::pop(){
assert(m_data.size() >0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
//获得最小元素
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> T& stackWithMin<T>::top() const{
return m_data;
}
//获得栈顶元素 返回常引用
template<typename T> const T& stackWithMin<T>::top() {
return m_data;
}
//大小
template<typename T> int stackWithMin<T>::size() const {
return m_data.size();
}
//是否为空
template<typename T> bool stackWithMin<T>::empty() const{
return m_data.empty();
}
main文件:代码
#include <iostream>
#include <stack>
#include <assert.h>
#include "minStack.h"
using namespace std;
int main()
{
stackWithMin<int> data;
data.push(3);
cout<< data.min()<<" ";
data.push(2);
cout<< data.min()<<" ";
data.push(3);
cout<< data.min()<<" ";
data.push(2);
cout<< data.min()<<" ";
return 0;
}
运行结果: