std::stack是一种容器适配器,它通过包装顺序容器来实现栈(先进后出)的数据结构。
template<
class T,
class Container = std::deque<T>
> class stack;
本文章的代码库:
https://gitee.com/gamestorm577/CppStd
成员函数
构造、析构和赋值
构造函数
可以构造一个空的stack,也可以用对应的容器或者另一个stack来构造一个stack。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1;
std::stack<int, std::vector<int>> s2(tmp);
std::stack<int, std::vector<int>> s3(s2);
std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;
std::cout << "s3 size = " << s3.size() << std::endl;
输出结果:
s1 size = 0
s2 size = 3
s3 size = 3
析构函数
销毁stack时,会调用各元素的析构函数。代码示例:
struct MyStruct
{
MyStruct(int i)
: Num(i)
{
}
~MyStruct()
{
std::cout << "~MyStruct: " << Num << std::endl;
}
int Num = 0;
};
std::vector<MyStruct> tmp{1, 2, 3};
std::stack<MyStruct, std::vector<MyStruct>> s(std::move(tmp));
std::cout << "end\n";
输出结果:
~MyStruct: 3
~MyStruct: 2
~MyStruct: 1
end
~MyStruct: 1
~MyStruct: 2
~MyStruct: 3
赋值函数
可以用另一个stack给stack赋值。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1(tmp);
std::stack<int, std::vector<int>> s2;
s2 = s1;
std::cout << "s2 size = " << s2.size() << std::endl;
输出结果:
s2 size = 3
元素访问
top
返回栈顶元素的引用。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s(tmp);
std::cout << "s top: " << s.top() << std::endl;
s.top() += 10;
std::cout << "s top: " << s.top() << std::endl;
输出结果:
s top: 3
s top: 13
容量
empty
检查stack是否为空。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1(tmp);
std::stack<int, std::vector<int>> s2;
std::cout << std::boolalpha;
std::cout << "s1 empty: " << s1.empty() << std::endl;
std::cout << "s2 empty: " << s2.empty() << std::endl;
输出结果:
s1 empty: false
s2 empty: true
size
返回stack中元素的个数。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1(tmp);
std::stack<int, std::vector<int>> s2;
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;
输出结果:
s1 size: 3
s2 size: 0
修改器
push
向栈顶插入元素。代码示例:
std::stack<int, std::vector<int>> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
std::cout << "s top: " << s.top() << std::endl;
输出结果:
s top: 4
emplace
在栈顶构造一个元素。代码示例:
struct MyStruct
{
MyStruct(int i)
{
std::cout << "MyStruct: " << i << std::endl;
}
};
std::stack<MyStruct> s;
s.emplace(1);
s.emplace(2);
s.emplace(3);
输出结果:
MyStruct: 1
MyStruct: 2
MyStruct: 3
pop
移除栈顶的元素。代码示例:
std::stack<int, std::vector<int>> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
while (!s.empty())
{
std::cout << "num: " << s.top() << std::endl;
s.pop();
}
输出结果:
num: 4
num: 3
num: 2
num: 1
swap
和另一个stack交换元素内容。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1;
std::stack<int, std::vector<int>> s2(tmp);
s1.swap(s2);
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;
输出结果:
s1 size: 3
s2 size: 0
非成员函数
比较运算符
比较两个stack是否相等。代码示例:
std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{3, 2, 1};
std::stack<int, std::vector<int>> s1(tmp1);
std::stack<int, std::vector<int>> s2(tmp2);
std::cout << std::boolalpha;
std::cout << "s1 == s2: " << (s1 == s2) << std::endl;
std::cout << "s1 != s2: " << (s1 != s2) << std::endl;
std::cout << "s1 < s2: " << (s1 < s2) << std::endl;
std::cout << "s1 <= s2: " << (s1 <= s2) << std::endl;
std::cout << "s1 > s2: " << (s1 > s2) << std::endl;
std::cout << "s1 >= s2: " << (s1 >= s2) << std::endl;
输出结果:
s1 == s2: false
s1 != s2: true
s1 < s2: true
s1 <= s2: true
s1 > s2: false
s1 >= s2: false
swap
交换两个stack的元素内容。代码示例:
std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1;
std::stack<int, std::vector<int>> s2(tmp);
std::swap(s1, s2);
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;
输出结果:
s1 size: 3
s2 size: 0