STL 中类 stack 实现了一个栈
1)push 能够插入元素
2)pop 移除栈顶元素
使用的时候,需要包含头文件 #include <stack>,stack 被声明如下:
namespace std
{
template <class T, class Container = deque<T> >
class stack;
}
第一个模板参数表示元素的类型,第二个模板参数表明了实现堆栈所使用的容器,即内部用于存储元素的容器,默认使用 deque,你可以使用任何的顺序容器,甚至于自己提供的顺序容器,只要含有 back(), push_back(), pop_back() 方法即可
定义一个栈:
std::stack<int> st;
std::stack<int, std::vector<int> > st2; // 使用 vector 做容器保存元素
这里提及一下 deque,对于 deque,元素被移除的时候,释放内存,而且在重新分配内存(realloc)的时候,不会拷贝元素,这是与 vector 不同的地方
1. 核心接口
栈少不了的三个核心接口:
1)void push() 插入元素到栈顶
2)void pop() 移除栈顶元素(注意,函数类型为 void)
3)value_type& top() 返回栈顶元素,并不会移除这个元素(注意,返回的是栈顶元素的引用),看下面的代码:
std::stack<int> st;
st.push(1);
st.top() = 2; // 可以方便的修改栈顶元素
std::cout << st.top() << "\n"; // 输出 2
注意在 STL 中,在栈为空时,top 和 pop 是未定义的,对于检查栈的大小,可以使用 empty 函数或者 size 函数
empty --- 如果栈为空,返回 true,否则返回 false
size --- 栈的大小
对于栈来说,几乎(不是全部)就是上面介绍的几个函数了
2. 类型
1)std::stack::value_type 元素的类型,等同于实现栈的顺序容器的类型,例如默认情况下,std::stack::value_type 等同于 std::deque::value_type
2)std::stack::size_type 无符号的整数类型,用于定义 stack 的大小
3)std::stack::container_type 容器类型
3. 函数补充
构造函数:
explicit stack::stack(const Container& cont);
比较操作符:
包括 ==, <=, >=, !=, <, >
两个栈相等的含义是,栈中元素数目,以及对应位置的元素相等
deque: 是一个double-ended queue,
1)支持随即存取,也就是[]操作符,
2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多
因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。