// <stack>
template < class T, class Container = deque<T> > class stack;

(Stack)是一个容器适配器(Container adaptor)类型,被特别设计用来运行于LIFO(Last-in first-out)场景,在该场景中,只能从容器末尾添加(Insert)或提取(Extract)元素。

  • T

    容器所包含的元素的类型。

    在类模板内部,使用其别名为 value_type 的成员类型。

    Container

    底层的用于存储元素的容器的类型。

  • stack 通常被实现为容器适配器,即使用一个特定容器类的封装对象作为它的底层容器。stack 提供了一系列成员函数用于操作它的元素,只能从容器“后面”压进(Push)元素或从容器“后面”提取(Pop)元素。容器中的“后面”位置也被称为“栈顶”。

    用来实现栈的底层容器必须满足顺序容器的所有必要条件。同时,它还必须提供以下语义的成员函数:

    • back()
    • push_back()​
    • pop_back()

    满足上述条件的标准容器有 std::vectorstd::dequestd::list,如果未特别指定 stack 的底层容器,标准容器 std::deque 将被使用。

    Any sequence container supporting operations back(), push_back() and pop_back() can be used to instantiate stack. In particular, vector, list  and deque can be used.

    C++编程语言国际标准:ISO/IEC 14882:2011

  • 成员类型 定义
    value_type 第一个模板参数 T
    container_type 第二个模板参数 Container
    size_type Container::size_type
    reference Container::reference
    const_reference Container::const_reference
  • (constructor) 创建 stack
    (destructor) 释放 stack
    operator= 赋值操作

    Element access:

    top 访问顶部元素

    Capacity:

    empty 判断是否为空
    size 返回有效元素个数

    Modifiers:

    push 在容器顶部插入元素
    pop 移除容器顶部的元素
    emplace C++11 在容器顶部放置插入元素
    swap 交换容器的内容
  • operator==、operator!=、operator<、operator<=、operator>、operator>= 

    关系操作符
    std::swap 交换两个栈的内容
  • 综合 1

    下面这个例子简单地介绍了 stack 的常用使用方法:

    #include <iostream>
    #include <stack>
    
    namespace ClassFoo {
    void StackExample1() {
        std::stack<int> foo1;
    
        std::cout << "foo1.empty():" << std::boolalpha 
            << foo1.empty() << std::endl;
        
        // 逐个压入元素
        std::cout << "压入四个元素:" << std::endl;
        foo1.push(1);
        std::cout << foo1.top() << " ";
        foo1.push(2);
        std::cout << foo1.top() << " ";
        foo1.push(3);
        std::cout << foo1.top() << " ";
        foo1.push(4);
        std::cout << foo1.top() << " " << std::endl;
    
        std::cout << "foo1.empty():" << std::boolalpha 
            << foo1.empty() << std::endl;
        std::cout << "foo1.size():"
            << foo1.size() << std::endl;
    
        // 逐个弹出元素
        std::cout << "弹出四个元素:" << std::endl;
        std::cout << foo1.top() << " ";
        foo1.pop();
        std::cout << foo1.top() << " ";
        foo1.pop();
        std::cout << foo1.top() << " ";
        foo1.pop();
        std::cout << foo1.top() << " " << std::endl;
        foo1.pop();
    
        std::cout << "foo1.empty():" << std::boolalpha 
            << foo1.empty() << std::endl;
        std::cout << "foo1.size():"
            << foo1.size() << std::endl;
    }
    }
    int main ()
    {
        ClassFoo::StackExample1();
        return 0;
    }

    输出

    foo1.empty():true
    压入四个元素:
    1 2 3 4 
    foo1.empty():false
    foo1.size():4
    弹出四个元素:
    4 3 2 1 
    foo1.empty():true
    foo1.size():0