淺談「棧」

棧(statck)是一種先進後出的(First In Last Out, FILO)的數據結構。棧只容許在棧頂上添加元素、彈出棧頂元素、獲取棧頂元素等簡單操做。在STL中,棧是以雙端隊列(deque)做爲底部結構實現非的,效率很高,甚至比手寫棧效率還高,由於儘管deque和數組同樣是連續空間,但有更智能的內存管理,在大可能是狀況下,常數都低於手寫版本的常數,於是在算法競賽中,更常使用STL提供的stack,若是要進行stack未提供的操做,也能夠改用deque————一樣無需手寫。算法

stack經常使用接口

先來看一下VS2008中的std::stack的源碼:數組

template<class _Ty, class _Container = deque<_Ty> >
class stack
{
public:
    typedef _Container container_type;
    typedef typename _Container::value_type value_type;
    typedef typename _Container::size_type size_type;
    typedef typename _Container::reference reference;
    typedef typename _Container::const_reference const_reference;
    stack() : c(){}
    explicit stack(const _Container& _Cont) : c(_Cont){}
    bool empty() const
    {
        return (c.empty());
    } 
    size_type size() const
    {
        return (c.size());
    }
    reference top()
    {
    return (c.back());
    }
    const_reference top() const
    {
    return (c.back());
    }
    void push(const value_type& _Val)
    {
        c.push_back(_Val);
    }
    void pop()
    {
        c.pop_back();
    }
    const _Container& _Get_container() const
    {
    return (c);
    }
protected:
    _Container c;
};

相信能看懂的人此刻都會相視一笑————stack簡單的連STL都不屑於把實現和定義分開......安全

從源碼中已經能夠獲取一切信息了,stack就是一個只提供了部分接口的deque,調用stack的成員函數就是間接調用deque的成員函數,另外,爲了嚴格遵循堆棧的數據後進先出原則,stack 不提供元素的任何迭代器操做。(欲成堆棧,必先被閹?強行下降實用性什麼鬼數據結構

成員函數簡介

建立 stack 對象
使用堆棧前,先要利用構造函數進行初始化,建立一個堆棧對象,以進行元素的入棧、出棧等操做。函數

  • stack() 默認構造函數,建立一個空的 stack 對象。
  • stack(const stack&) 複製構造函數,用一個 stack 堆棧建立一個新的堆棧。
  • empty() 堆棧爲空則返回真
  • pop() 移除棧頂元素
  • push() 在棧頂增長元素
  • size() 返回棧中元素數目
  • top() 返回棧頂元素

小結

堆棧是一種應用很是普遍的數據結構。C++ STL 將這種數據結構和它若干受限制操做用泛型類 stack 容器封裝出來,包括堆棧初始化、元素入棧、取棧頂元素、元素出棧、判斷堆棧是否非空和取得當前堆棧大小等,應用起來十分容易。
stack的元素出棧操做是不返回棧頂元素的,須要另外經過取棧頂函數得到。這種分離實現是考慮到出棧函數若直接返回棧頂元素,將會致使返回值的數據引用安全問題或沒必要要的低效複製函數的調用。
從 stack 內部實現看,stack 堆棧是不設最大容量的,但可經過 size 函數獲取當前堆棧的大小,以判斷是否容許繼續讓元素入棧,實現具備最大容量限制的堆棧。code

相關文章
相關標籤/搜索