浅谈“栈”

栈(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

相关文章
相关标签/搜索