目录
概念
在 C++ 中,stack 是一种容器适配器,它通过封装底层容器的实现,为开发人员提供了“栈”这一数据结构的高层次操作接口。
实现原理
栈的定义
栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
这意味着最后添加到栈中的元素将是第一个被移出的元素,类似于现实生活中的一摞盘子,最后放上去的盘子会最先被拿走。所以栈遵循后进先出(Last In First Out,LIFO)原则,简称LIFO结构。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
栈满:存满元素的栈。在动态链式存储实现中,理论上不存在栈满状态,但受系统内存资源限制。
C++中的stack
C++ 中的 stack
可以使用多种标准容器(如 vector
、deque
、list
)作为底层容器,默认情况下使用 deque
。
基本操作与方法接口
定义、初始化和赋值
#include <iostream>
#include <stack>
#include <vector>
int main()
{
// 使用默认的 deque 作为底层容器
std::stack<int> stack1;
// 使用 vector 作为底层容器
std::stack<int, std::vector<int>> stack2;
}
stack本身并没有直接在初始化时赋值的标准构造函数,如果非要在初始时赋值,可以借助底层容器来间接实现:
#include <iostream>
#include <stack>
#include <vector>
int main()
{
// 初始化一个 vector 并赋值
std::vector<int> v = { 1, 2, 3, 4, 5 };
// 使用这个 vector 来构造 stack
std::stack<int, std::vector<int>> stack(v);
}
插入
push():向栈顶插入元素。
stack.push(10); //向stack的栈顶插入10
访问
top():返回栈顶元素的引用,但不将其从栈中移除。
#include <iostream>
#include <stack>
int main()
{
std::stack<int> stack;
stack.push(10);
stack.push(20);
std::cout << stack.top() << std::endl;
}
删除
pop():移除栈顶元素,但不返回该元素的值。
#include <iostream>
#include <stack>
int main()
{
std::stack<int> stack;
stack.push(10);
stack.push(20);
stack.push(3);
stack.push(7);
std::cout << stack.top() << std::endl;
stack.pop();
std::cout << stack.top();
}
判空
empty():判断栈是否为空,如果为空则返回 true
,否则返回 false
。
#include <stack>
#include <iostream>
int main()
{
std::stack<int> stack;
std::cout << stack.empty() << std::endl;
stack.push(10);
std::cout << stack.empty();
}
获取元素个数
size():返回栈中元素的数量。
#include <stack>
#include <iostream>
int main()
{
std::stack<int> stack;
stack.push(10);
stack.push(20);
std::cout << stack.size();
}
交换
swap():用于交换两个栈的内容。
#include <iostream>
#include <stack>
int main()
{
// 创建第一个栈并插入元素
std::stack<int> stack1;
stack1.push(1);
stack1.push(2);
stack1.push(3);
// 创建第二个栈并插入元素
std::stack<int> stack2;
stack2.push(4);
stack2.push(5);
// 输出交换前两个栈的栈顶元素
std::cout << "Before swap: stack1 top = " << stack1.top() << ", stack2 top = " << stack2.top() << std::endl;
// 交换两个栈的内容
stack1.swap(stack2);
// 输出交换后两个栈的栈顶元素
std::cout << "After swap: stack1 top = " << stack1.top() << ", stack2 top = " << stack2.top() << std::endl;
}
构造新元素
emplace ()
:用于在栈中直接构造一个新元素,而不是先创建一个临时对象,再将其复制或移动到栈中。这可以提高性能,尤其是对于那些创建和复制成本较高的对象。
未完待续还没有彻底搞清楚与push的区别未完待续
遍历
stack不提供迭代器,但可以采用以下方法遍历栈中的元素:
#include <iostream>
#include <stack>
void printStack(std::stack<int> stack)
{
while (!stack.empty()) //或者使用“while (stack.size() > 0)”
{
std::cout << stack.top() << " ";
stack.pop();
}
std::cout << std::endl;
}
int main()
{
std::stack<int> stack;
stack.push(10);
stack.push(20);
stack.push(3);
stack.push(7);
printStack(stack);
}
参考与引用
C++中stack的用法(超详细,入门必看)_c++ stack-优快云博客
未完待续
写出容器方法的底层实现原理和复杂度。
未完待续