栈(statck)是一种先进后出的(First In Last Out, FILO)的数据结构。栈只容许在栈顶上添加元素、弹出栈顶元素、获取栈顶元素等简单操做。在STL中,栈是以双端队列(deque)做为底部结构实现非的,效率很高,甚至比手写栈效率还高,由于尽管deque和数组同样是连续空间,但有更智能的内存管理,在大可能是状况下,常数都低于手写版本的常数,于是在算法竞赛中,更常使用STL提供的stack,若是要进行stack未提供的操做,也能够改用deque————一样无需手写。算法
先来看一下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 对象
使用堆栈前,先要利用构造函数进行初始化,建立一个堆栈对象,以进行元素的入栈、出栈等操做。函数
堆栈是一种应用很是普遍的数据结构。C++ STL 将这种数据结构和它若干受限制操做用泛型类 stack 容器封装出来,包括堆栈初始化、元素入栈、取栈顶元素、元素出栈、判断堆栈是否非空和取得当前堆栈大小等,应用起来十分容易。
stack的元素出栈操做是不返回栈顶元素的,须要另外经过取栈顶函数得到。这种分离实现是考虑到出栈函数若直接返回栈顶元素,将会致使返回值的数据引用安全问题或没必要要的低效复制函数的调用。
从 stack 内部实现看,stack 堆栈是不设最大容量的,但可经过 size 函数获取当前堆栈的大小,以判断是否容许继续让元素入栈,实现具备最大容量限制的堆栈。code