前进的道路不是一帆风顺的,要随时迎接挑战,敢于战胜困难!

坚持一下,找人聊聊天,释放一些压力!

 

设计包含min函数的栈(源码)

采用两个双端队列实现,一个存数据,一个是辅助栈,存第一个栈的最小元素的地址,实现技巧在于辅助栈存放的是第一个栈的最小元素的地址,难度在于使用模板实现。

#include <deque>
#include <assert.h>
#include <iostream>

using namespace std;

template <typename T>class CStackWithMin
{
public:
 CStackWithMin(void){}
 virtual ~CStackWithMin(void){}

 T& top(void);
 const T&top(void)const;

 void push(const T& value);
 void pop(void);

 const T& min(void) const;

 const T& size(void) const;

private:
 deque<T> m_data;//the element of the stack
 deque<size_t> m_minIndex; //the index of minimum elements
};

template<typename T> T& CStackWithMin<T>::top()
{
 return m_data.back();
}

template<typename T> const T& CStackWithMin<T>::top() const
{
 return m_data.back();
}

template<typename T> void CStackWithMin<T>::push(const T& value)
{
 m_data.push_back(value);

 if (m_minIndex.size()==0)
 {
  m_minIndex.push_back(0);
 }
 else
 {
  if(value<m_data[m_minIndex.back()])
   m_minIndex.push_back(m_data.size()-1);
  else
   m_minIndex.push_back(m_minIndex.back());
 }
}

template<typename T> void CStackWithMin<T>::pop()
{
 m_data.pop_back();

 m_minIndex.pop_back();
}

template<typename T>const T& CStackWithMin<T>::min()const
{
 assert(m_data.size()>0);
 assert(m_minIndex.size()>0);

 return m_data[m_minIndex.back()];
}

template<typename T>const T& CStackWithMin<T>::size() const
{
 assert(m_data.size()>0);
 assert(m_minIndex.size()>0);

 return m_data.size();
}

int main()
{
 CStackWithMin<int> cs;

 cs.push(3);
 cs.push(4);
 cs.push(2);
 cs.push(1);
 cs.push(5);
 cs.push(6);
 cs.push(0);
 cout<<"cs.size() = "<<cs.size()<<endl;
 int len=cs.size();
 for (int i=0; i<len; i++)
 {
  cout<<"cs.min() = "<<cs.min()<<endl;
  cout<<"cs.top() = "<<cs.top()<<endl;
  cs.pop();
 }

 return 0;
}

posted on 2010-08-10 13:53  山径山精  阅读(1115)  评论(0编辑  收藏  举报

导航