栈(stack)又名堆栈, 它是一种运算受限制的线性表. 其限制是仅允许在表的一端进行插入和删除运算, 这一端称为栈顶, 相对的, 把另一端称为栈底.
向一个栈插入新元素称作进栈, 入栈或压栈, 它是把元素放在栈顶元素上面, 成为新的栈顶元素.
从一个栈删除元素又称为出栈或退栈, 它是删除栈顶元素, 使其相邻元素成为栈顶元素.
使用STL中的stack, 需导入头文件.
#include
using namesapce std;
stack没有像string, vector等过多的带参构造, 且只显式的initializer_list列表初始化.
stack<int> st{ 1, 2, 3 }; //错误
stack<int> st1 = { 1, 2, 3 }; //错误
stack<int> st2(initializer_list<int>{ 1, 2, 3 }); //正确, 这里会
常用的一些构造
stack<int> st; //构造一个空的堆栈
stack<int> st1(st); //拷贝构造
deque<int> dq{ 1, 2, 3 };
stack<int> st2(dq); //虽然stack只支持显式的列表初始化对象, 但可以通过支持列表初始化的deque对象初始化stack
重载的赋值运算符=.
deque<int> dq{ 1, 2, 3 };
stack<int> st(dq);
stack<int> st2 = st; //注意这里会调用的是赋值构造, 因为st2没有初始化, 即stack(const T& right);
stack<int> st3;
st3 = st1; //这样才是赋值操作, 因为st3已经初始化为一个空的stack
deque<int> dq{ 1, 2, 3 };
stack<int> st(dq);
stack<int>::size_type nSize = st.size();
deque<int> dq{ 1, 2, 3 };
stack<int> st(dq);
if (st.empty())
{
//空栈
}
else
{
//非空
}
stack只允许在栈顶进行插入删除操作.
堆栈顶部是最近添加的元素所占据的位置,并且是容器末尾处的最后一个元素。
stack<int> st;
st.push(1);
st.push(2);
st.push(3);
堆栈必须为非空才能应用成员函数。 堆栈顶部是最近添加的元素所占据的位置,并且是容器末尾处的最后一个元素。
stack<int> st;
st.push(1);
st.push(2);
st.push(3);
for (int i = 0; i < st.size(); i++)
{
st.pop();
}
stack只允许在栈顶操作, 因此不提供随机访问.
对非空堆栈顶部容器中的最后一个元素的引用, 并且不会移除该栈顶元素。
stack<int> st(deque<int>{ 1, 2, 3 });
stack<int>::size_type nSize = st.size();
for (int i = 0; i < nSize; i++)
{
cout << st2.top() << endl;
st2.pop();
}
//注意不能这样
for (int i = 0; i < st2.size(); i++)
{
cout << st2.top() << endl;
st2.pop();
}
//但是可以这样
while (st.size() > 0)
{
cout << st.top() << endl;
st.pop();
}
//不支持范围for循环
for (auto nVal : st)
{
cout << st.top() << endl;
}
//没有迭代器操作