这样做有木有问题,栈常数时间取最小值
想用常数时间,那就得用辅助栈
编程之美的3.7节,和该博客http://zhedahht.blog.163.com/blog/static/25411174200712895228171/都用了和数据栈长度同步增长的辅助栈,我觉得没必要啊,辅助栈里只要存当前最小值即可,只有在最坏情况下(入栈数据降序),辅助栈大小等于数据栈,平均情况下辅助栈能节省不少空间的。而且流程上也比编程之美和那个博客简单
写了个小程序没什么问题,是不是我欠考虑?
我算法是弱项,没参加过ACM之类,为了应付互联网正在恶补
#include <stack>#include <iostream>using namespace std;template <typename T>class MyStack{public: void Push(const T &e); T& Top(); const T& Top() const; void Pop(); const T& Min(); bool Empty();private: stack<T> m_stack; stack<T> m_min;};template <typename T> void MyStack<T>::Push(const T &e){ m_stack.push(e); if (m_min.empty()) m_min.push(e); else if (e <= Min()) m_min.push(e);}template <typename T> T& MyStack<T>::Top(){ return m_stack.top();}template <typename T> const T& MyStack<T>::Top() const{ return m_stack.top();}template <typename T> void MyStack<T>::Pop(){ if (m_stack.top() == m_min.top()) m_min.pop(); m_stack.pop();}template <typename T> const T& MyStack<T>::Min(){ return m_min.top();}template <typename T> bool MyStack<T>::Empty(){ return m_stack.empty();}int main(){ MyStack<int> s; s.Push(3); cout << s.Min() << endl; s.Push(4); cout << s.Min() << endl; s.Push(2); cout << s.Min() << endl; s.Push(1); cout << s.Min() << endl; s.Pop(); cout << s.Min() << endl; s.Pop(); cout << s.Min() << endl; s.Push(0); cout << s.Min() << endl; s.Pop(); cout << s.Min() << endl; s.Pop(); cout << s.Min() << endl; getchar();}