目录
至于栈的结构与原理(先入后出)这里就不细说了,这里主要记录下 C++ 的头文件 <stack> 有关栈的操作是如何使用的。
1、有关函数的作用
stack<type> s; | 定义一个参数类型为 type 的栈 |
s.push() | 压栈,无返回值 |
s.emplace() | 压栈,无返回值(与push的区别下面细说) |
s.pop() | 栈顶元素出栈,不返回元素,无返回值 |
s.top() | 返回栈顶元素,该元素不出栈 |
s.empty() | 判断栈是否为空,是返回 true |
s.size() | 返回栈中元素数量 |
push() 与 emplace() 的区别:
首先 s.push() 与 s.emplace() 的最终执行效果是一模一样的,都是在栈顶加入一个元素,差别就是压栈元素的来源可能不同。
对于包含简单的基本类型(如int)的栈来说两者之间几乎没有差别,但当栈的类型是一些大型、复杂的类,具有复杂的构造函数或复制构造函数时,区别就出现了:
- push() 接受一个已经存在的元素(比如已实例化的类或变量),并将它的副本附加到容器中。push总是只接受一个参数,即要复制到栈顶中的元素。
- emplace() 可以现场通过参数列表创建该类的一个实例放到栈顶。要放置的参数将作为参数转发给栈中所含的类的构造函数。如果类有默认构造函数,emplace 可以有一个参数、多个参数,或者根本没有参数。
例如,当栈的参数是类时,push的参数必须是已实例化的类名作为参数,而 emplace 则可以直接使用类初始化参数现场初始化一个类实例加入栈顶。因此 emplace 的功能比 push 更强大,且兼容 push,但一般使用过程中,使用 push 就足够了。
( 这个问题在网上好像很少有人关注欸,如果我没说清楚那就去下面这个链接里自行理解哈)C++: Stack's push() vs emplace() - Stack Overflowhttps://stackoverflow.com/questions/26198350/c-stacks-push-vs-emplace/26198609
2、测试用例
#include <stack>
#include <iostream>
#include <string>
using namespace std;
int main()
{
stack<string> test_stack;
test_stack.push("you~ "); // 向栈中压入元素(pop)
test_stack.push("meet "); // 向栈中压入元素(pop)
test_stack.push("to "); // 向栈中压入元素(pop)
test_stack.push("nice "); // 向栈中压入元素(pop)
cout << "size of test_stack: " << test_stack.size() << endl; // 获取栈内元素数量
while (!test_stack.empty()) // 栈是否为空,是:true
{
string temp = test_stack.top(); // 返回栈顶元素,该元素不出栈
cout << temp ;
test_stack.pop(); // 栈顶元素出栈,不返回元素
}
return 0;
}
// 运行结果 //
size of test_stack: 4
nice to meet you~