目录
一、stack 简介
C++ 中,std::stack
容器是一种先进后出(First In Last Out, FILO)的数据结构,且只有一个出口。
栈(stack)的结构如下:类似与现实中的手枪弹夹,每次填装子弹时最先填装的子弹被压入弹夹底部,最后填装的子弹位于弹夹顶部,射击时每次弹出弹夹顶部的子弹。
二、stack 构造函数
构造函数原型 | 解释 | |
---|---|---|
1 | stack<T> stk | 默认构造 |
2 | stack(const stack &stk) | 拷贝构造 |
三、stack 赋值操作
函数原型:= | 解释 | |
---|---|---|
1 | stack& operator=(const stack &stk) | 重载=操作符 |
四、stack 数据存取
函数原型:push、pop、top | 解释 | |
---|---|---|
1 | push(elem) | 入栈:向栈顶添加元素 |
2 | emplace() | 入栈:构造和添加元素 |
3 | pop() | 出栈:移除当前栈顶元素 |
4 | top() | 返回栈顶元素 |
push与emplace的异同点
- 对于int、double等内置数据类型而言,
push()
和emplace()
是相同的 - 对于自定义数据类型而言,使用
push()
前必须先将要添加的对象构造出来(实例化),而使用emplace()
既可以填入实例化的对象也可以填入对象的构造参数
总结:
push
的功能emplace
都包含。push
传入的对象需要事先构造好,再复制过去插入容器中;而emplace
则可以自己使用构造函数所需的参数构造出对象,并直接插入容器中。emplace
相比于push
省去了复制的步骤,则使用emplace
会更加节省内存。
示例:
#include <iostream>
#include <stack> //必须包含该头文件
using namespace std;
class ObjNumber
{
public:
string m_objName;
int m_number;
public:
ObjNumber(string name, int num)
{
m_objName = name;
m_number = num;
}
};
void test01()
{
stack<ObjNumber> s1;
ObjNumber obj1("茶叶", 1); //实例化
s1.push(obj1); //push必须填入实例化的对象
s1.emplace(obj1); //emplace既可以填入实例化的对象
s1.emplace("馒头", 2); //emplace也可以填入构造函数的参数
cout << "s1中元素数量为:" << s1.size() << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
//result
s1中元素数量为:3
五、stack 其他操作
函数原型:empty、size、swap | 解释 | |
---|---|---|
1 | empty() | 判断栈是否为空 |
2 | size() | 返回栈的大小 |
3 | swap(stack<T> & other_stk) | 将当前栈中元素和other_stk中元素交换 |
注意: swap()
交换的两个栈中包含元素的类型必须相同。
示例:
#include <iostream>
#include <stack> //必须包含该头文件
using namespace std;
void printStack(stack<int> &stk)
{
while (!stk.empty())
{
cout << "当前栈顶元素:" << stk.top() << endl;
stk.pop(); //弹出栈顶元素
}
}
void test01()
{
stack<int> s1;
s1.push(1);
s1.push(2);
s1.push(3);
stack<int> s2(s1); //拷贝
cout << "s1中元素数量为:" << s1.size() << endl;
cout << "s1中元素为:" << endl;
printStack(s1);
cout << "s2中元素数量为:" << s2.size() << endl;
cout << "s2中元素为:" << endl;
printStack(s2);
}
int main()
{
test01();
system("pause");
return 0;
}
//result
s1中元素数量为:3
s1中元素为:
当前栈顶元素:3
当前栈顶元素:2
当前栈顶元素:1
s2中元素数量为:3
s2中元素为:
当前栈顶元素:3
当前栈顶元素:2
当前栈顶元素:1