题目
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数
思路
不可以用个中间变量来存放最小值,这种在对于如栈时最小值的更新是可以起到作用的,但是出栈是若果包含该最小值的变量弹出了,最小值就无法实现更新了,所以用一个辅助栈来实现最小值的更新
辅助栈(m_min)工作原理:
入栈
- 数据进去数据栈(m_data)
- 当辅助栈为空时或要入栈的元素小于辅助栈的栈顶元素,进入辅助栈
- 当它不为空时,把辅助栈的栈顶元素在进行一次入栈操作
出栈
- 数据栈和辅助栈同时弹出栈顶元素
min函数只需返回辅助栈的栈顶元素
#include <iostream> #include <stack> #include <assert.h> using namespace std; template <class T> class Solution { public: void push(const T &value); void pop(); const T &min() const; void print(); private: stack<T> m_data; stack<T> m_min; }; template <class T> void Solution<T>::push(const T &value) { m_data.push(value); if(m_min.empty()||value<m_min.top()) m_min.push(value); else m_min.push(m_min.top()); } template <class T> void Solution<T>::pop() { assert(m_data.size()>0&&m_min.size()>0); m_data.pop(); m_min.pop(); } template <class T> const T &Solution<T>::min() const { assert(m_data.size()>0&&m_min.size()>0); return m_min.top(); } template <class T> void Solution<T>::print() { cout<<" m_data."<<endl; while(!m_data.empty()) { cout<<m_data.top()<<endl; m_data.pop(); } cout<<" m_min."<<endl; while(!m_min.empty()) { cout<<m_min.top()<<endl; m_min.pop(); } } int main() { Solution<int> s; while(1) { int x; cin>>x; if(x) s.push(x); else break; } int res=s.min(); cout<<res<<endl; //s.print(); return 0; }