2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
#include<iostream>
#include <vector>
#include <cassert>
using namespace std;
template <typename T>
class StackSuppliedMin{
private:
vector<T> dates;
vector<size_t> minSta;
public:
void push(T date);
void pop();
T min();
void display();
};
template <typename T> void StackSuppliedMin<T>::push(T date){
dates.push_back(date);
if(minSta.empty() || date <= dates[minSta.back()])
minSta.push_back(dates.size()-1);
}
template <typename T> void StackSuppliedMin<T>::pop(){
assert(!dates.empty());
if(dates.back() == dates[minSta.back()])
minSta.pop_back();
dates.pop_back();
}
template <typename T> T StackSuppliedMin<T>::min(){
assert(!dates.empty() && !minSta.empty());
return dates[minSta.back()];
}
template <typename T> void StackSuppliedMin<T>::display(){
cout << min() << endl;
}
int main(){
StackSuppliedMin<int> iStack;
iStack.push (6);
iStack.push (7);
iStack.push (4);
iStack.push (5);
iStack.push (4);
iStack.push (2);
iStack.push (8);
iStack.display();
iStack.pop();
iStack.display();
iStack.pop();
iStack.display();
iStack.pop();
iStack.display();
iStack.pop();
iStack.display();
iStack.pop();
iStack.display();
iStack.pop();
iStack.display();
iStack.pop();
return 0;
}