💗个人主页💗
⭐个人专栏——C++学习⭐
💫点击关注🤩一起学习C语言💯💫
目录
导读
一、stack
1. stack介绍
2. stack使用
二、queue
1. queue介绍
2. queue使用
三、deque
1. deque介绍
2. deque的迭代器
3. deque使用
四、三者关系
1. STL标准库中stack和queue的底层结构
导读
今天我们主要来了解stack、queue、和deque的一些基本使用,下次再来说下他们的模拟实现。
其中栈和队列我们在数据结构部分就已经用C来实现了一遍,大家有兴趣的可以点进主页。
一、stack
1. stack介绍
Stack,中文翻译为"栈",是一种数据结构,在计算机科学中经常被使用。Stack的特点是先进后出(LIFO,Last In First Out),它只允许在一端进行插入和删除操作,这一端被称为栈顶。
具体的流程大姐可以点进这个链接:http://t.csdnimg.cn/OxrHQ
2. stack使用
- 使用stack类时,需要包含<stack>头文件。
- 栈中存储的元素类型可以是任意的,不仅限于整数类型。
- 栈的大小没有限制,可以根据需要动态调整。
- 在使用top()或pop()操作时,要确保栈不为空,否则会导致未定义行为。
#include <iostream>
using namespqce std;
#include <stack>
int main()
{
//定义栈对象:
stack<int> st;// 创建一个空的整数类型栈
//入栈操作:
st.push(1);
st.push(2);
st.push(3);
st.push(4);
while (!st.empty())
{
cout << st.top() << " ";//获取栈顶元素
//出栈
st.pop();
}
cout << endl;
return 0;
}
二、queue
1. queue介绍
queue(队列)是一种先进先出(FIFO,First-In-First-Out)的数据结构,其中元素按照加入队列的顺序进行处理。
队列有两个基本操作:入队(enqueue)和出队(dequeue),分别指元素加入队列和从队列中移除元素。
除此之外,队列还提供了一些其他的操作,如获取队首元素、判断队列是否为空等。
具体的图解点击:http://t.csdnimg.cn/OxrHQ
2. queue使用
- 使用queue类时,需要包含<queue>头文件。
- 队列中存储的元素类型可以是任意的,不仅限于整数类型。
- 队列的大小没有限制,可以根据需要动态调整。
- 在使用front()、pop()操作时,要确保队列不为空,否则会导致未定义行为。
#include <iostream>
using namespace std;
#include <queue>
int main()
{
//定义队列对象:
queue<int> q;//创建一个空的整数类型队列
//入队操作
q.push(1);
q.push(2);
cout << q.front() << " ";//获取队首元素
q.pop();// 出队
q.push(3);
q.push(4);
while (!q.empty())//判空
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
return 0;
}
三、deque
1. deque介绍
deque(双端队列)是一种能够在两端进行操作的数据结构。
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组。
它既可以在前端进行插入和删除操作,也可以在后端进行插入和删除操作。
deque的特点包括:
- 可以在队列的任一端进行插入和删除操作,也就是说可以在队列的前端(头部)和后端(尾部)进行操作。
- deque的大小可以动态调整,可以根据需要增加或减少元素。
- deque中的元素在内存中是连续存储的,这使得访问元素的速度比较快。
- deque不需要预留内存空间,可以根据需要动态分配内存。
deque与vector相似,但deque具有更高的插入和删除元素的性能,因为它允许在队列的两端进行操作。但与之相比,deque的随机访问性能略低,因为deque中的元素并不是像vector那样在内存中是连续存储的。
2. deque的迭代器
双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂。
int main()
{
deque<int> mydeque = { 1, 2, 3, 4, 5 };
for (deque<int>::iterator it = mydeque.begin(); it != mydeque.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
3. deque使用
#include <iostream>
using namespace std;
#include <deque>
int main()
{
deque<int> myDeque; // 创建一个整数类型的双端队列
// 在前端插入元素
myDeque.push_front(3);
myDeque.push_front(2);
myDeque.push_front(1);
// 在后端插入元素
myDeque.push_back(4);
myDeque.push_back(5);
myDeque.push_back(6);
// 打印双端队列的元素
cout << "双端队列元素: ";
for (auto element : myDeque)
{
cout << element << " ";
}
cout << endl;
// 删除前端元素
myDeque.pop_front();
// 删除后端元素
myDeque.pop_back();
// 获取前端元素
int frontElement = myDeque.front();
cout << "前端元素: " << frontElement << endl;
// 获取后端元素
int backElement = myDeque.back();
cout << "后端元素: " << backElement << endl;
// 获取双端队列大小
int dequeSize = myDeque.size();
cout << "双端队列大小: " << dequeSize << endl;
// 判断双端队列是否为空
bool isEmpty = myDeque.empty();
cout << "是否为空? " << (isEmpty ? "Yes" : "No") << endl;
return 0;
}
四、三者关系
1. STL标准库中stack和queue的底层结构
虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配 器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。