C++初阶(十七)--STL--stack和queue详解及使用
目录
stack
概念
stack的定义
stack的使用
queue
概念
queue的定义
queue的使用
在 C++ 的标准模板库(STL)中,stack
(栈)和queue
(队列)是非常重要的容器适配器。它们基于其他基础容器实现,为我们提供了方便且高效的数据存储和操作方式,在许多算法和程序设计场景中都有着广泛的应用。本篇博客将详细介绍stack
和queue
的相关知识及其使用方法。
stack
概念
栈是一种先进后出(First In Last Out,FILO)的数据结构。就好比一个只能从一端放入和取出物品的容器,先放入的物品要等后放入的物品都取出后才能被取出。
stack的定义
在 STL 中,stack
是一个容器适配器,它默认使用deque
作为底层容器来实现。当然,我们也可以指定使用vector
或list
作为底层容器,例如:
#include <stack>
#include <vector>
#include <list>
int main()
{
//使用默认的适配器
std::stack<int> st1;
// 使用 vector 作为底层容器的 stack
std::stack<int, std::vector<int>> s1;
// 使用 list 作为底层容器的 stack
std::stack<int, std::list<int>> s2;
return 0;
}
stack的使用
这些成员函数大部分都已经是非常熟悉的了,所以这里直接把常见的用简单代码示范一下即可。
#include <iostream>
#include <stack>
int main()
{
// 创建一个存储整数的栈
std::stack<int> myStack;
// 使用push函数向栈中插入元素
myStack.push(10);
myStack.push(20);
myStack.push(30);
// 使用size函数获取栈的大小
std::cout << "Stack size: " << myStack.size() << std::endl;
// 使用top函数获取栈顶元素
std::cout << "Top element: " << myStack.top() << std::endl;
// 使用pop函数弹出栈顶元素
myStack.pop();
// 再次查看栈顶元素和栈的大小
std::cout << "After pop, top element: " << myStack.top() << std::endl;
std::cout << "After pop, stack size: " << myStack.size() << std::endl;
// 使用empty函数判断栈是否为空
if (myStack.empty()) {
std::cout << "Stack is empty." << std::endl;
} else {
std::cout << "Stack is not empty." << std::endl;
}
return 0;
}
接下来不是很常用的一些,只介绍简单的使用,用时可以再去查文档
emplace
emplace
函数用于在栈顶原地构造元素,相比push
,如果插入的是对象,emplace
可能会更高效,因为它避免了额外的复制或移动操作。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
struct Person
{
string name;
int age;
Person(string n, int a)
: name(n)
, age(a)
{}
};
int main() {
stack<Person> people;
// 使用emplace构造并插入元素
people.emplace("Alice", 25);
if (!people.empty())
{
const Person& p = people.top();
cout << "Top person: " << p.name << ", age: " << p.age <<endl;
}
return 0;
}
swap
swap
函数用于交换两个栈的内容。
int main() {
std::stack<int> stack1;
stack1.push(1);
stack1.push(2);
std::stack<int> stack2;
stack2.push(3);
stack2.push(4);
// 交换两个栈的内容
stack1.swap(stack2);
return 0;
}
queue
概念
队列是一种先进先出(First In First Out,FIFO)的数据结构。想象成一个排队的场景,先进入队列的元素先被处理。
queue的定义
在 STL 中,queue是一个容器适配器,它默认使用deque
作为底层容器来实现。当然,我们也可以指定使用vector
或list
作为底层容器,例如:
//默认容器
queue<int> q1;
//特定适配器
queue<int, vector<int>> q2;
queue<int, list<int>> q3;
queue的使用
这里对常见函数进行简单示范:
#include <queue>
#include <iostream>
using namespace std;
struct MyStruct
{
int x;
MyStruct(int a)
: x(a)
{}
};
int main()
{
// 1. 使用默认构造函数创建队列
queue<int> myQueue;
// 2. 使用empty检查队列是否为空
if (myQueue.empty())
{
cout << "队列是空的" << endl;
}
// 3. 使用push插入元素
myQueue.push(1);
myQueue.push(2);
// 4. 使用size获取队列大小
cout << "队列的大小是: " << myQueue.size() << endl;
// 5. 使用front访问队列头部元素
int frontElement = myQueue.front();
cout << "队列头部的元素是: " << frontElement << endl;
// 6. 使用back访问队列尾部元素
int backElement = myQueue.back();
cout << "队列尾部的元素是: " << backElement << endl;
// 7. 使用emplace构造并插入元素
queue<MyStruct> myStructQueue;
myStructQueue.emplace(3);
// 8. 使用pop移除队列头部元素
myQueue.pop();
// 9. 交换两个队列(这里使用成员函数swap)
queue<int> anotherQueue;
anotherQueue.push(4);
myQueue.swap(anotherQueue);
// 10. 使用关系运算符比较队列(这里比较是否相等)
if (myQueue == anotherQueue)
{
cout << "两个队列相等" << endl;
}
// 11. 使用非成员函数swap交换队列(与成员函数swap功能类似)
queue<int> queue1;
queue1.push(5);
queue<int> queue2;
queue2.push(6);
swap(queue1, queue2);
return 0;
}
本篇博客到此结束,欢迎评论区留言~