定義棧的數據結構,要求添加一個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;
}
運行結果: