1.list(几乎遇不到)
1.1.list的定义和结构
list的使用频率不搞,在做题时极少遇到需要使用list的情景.
list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器.list容器以节点(node)的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构.
list容器的定义和结构如下:
template <class T,class Allocator = std::allocator<T>>
class list;
list容器模板接受2和参数:
1.T:指定容器中存储的元素类型.
2.Allocator(可选):指定用于分配器类型,默认为std::allocator<T>.
list容器的特点包括:
双向性:每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内在链表中的任意位置进行插入,删除和访问操作.
动态大小:链表的大小可以根据需要动态扩展或收缩,不需要预先指定容器的大小.
不连续存储:链表中的节点可以在内存中的任意位置分布,不要求连续存储,因此插入和删除操作不会导致元素的移动.
list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包含插入,删除,访问,反转等操作.可以使用迭代器来遍历链表中的元素.
以下是一个示例,展示如何使用list容器:
#include <bits/stdc++.h>
using namespace std;
int main(){
list<int> myList;//创建一个list容器
//插入数据
myList.push_back(1);
myList.push_back(2);
myList.push_back(3);
//在链表的头部插入数据
myList.push_front(0);
for(int num:myList){ //遍历链表并输出元素
cout << num << " ";
}
return 0;
}
1.2.list的常用函数
list容器提供了多个常用的成员函数来操作和访问链表中的元素.
以下是一些常用的list函数的解释:
push_back() | 将元素插入到链表的末尾 |
push_front() | 将元素插入到链表的开头 |
pop_back() | 移除链表末尾的元素 |
pop_front() | 移除链表开头的元素 |
size() | 返回链表元素的个数 |
empty() | 检查链表中的所有元素 |
clear() | 清空链表中的所有元素 |
front() | 返回链表中最后一个元素的引用 |
back() | 放回链表中最后一个元素的引用 |
begin() | 返回指向链表第一个元素的迭代器 |
end() | 返回指向链表末尾的下一个位置的迭代器 |
insert() | 在指定位置之前插入一个或多个元素 |
erase() | 从链表中移除指定位置的一个或多个元素 |
1.3.代码示例
#include <algorithm>
#include <bits/stdc++.h>
#include <iterator>
using namespace std;
int main(){
list<int> mylist;
for(int i=1;i <= 5;++i){
mylist.push_back(i);
}
//从头到位输出list中的元素
for(const auto &i:mylist) cout << i << ' ';
cout << '\n';
//将mylist中元素反转
reverse(mylist.begin(),mylist.end());
for(const auto &i:mylist) cout << i << ' ';
cout << '\n';
//在第一个元素的后一个位置加上元素0
mylist.insert(++mylist.begin(),0);
for(const auto &i:mylist) cout << i << ' ';
cout<<'\n';
mylist.erase(++ ++ mylist.begin(),-- mylist.end());
//输出mylist的大小
cout << "链表大小为: " << mylist.size() << '\n';
for(const auto &i:mylist) cout << i << ' ';
cout << '\n';
return 0;
}
2.stack
2.1.stack的定义和结构
stack是一种后进先出(LIFO:Last In First out)的数据结构,使用前需要包含头文件<stack>.
stack提供了一组函数来操作和访问元素,但它的功能相对较简单.
stack的定义和结构如下(仅作了解即可):
template <class T,class Container = deque<T>>
class stack;
T:表示存储在stack中的元素的类型.
Container:表示底层容器的类型,默认为deque.也可以使用其他容器类型,如vector或list.
stack的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素.
2.2.stack的常用函数
函数 | 描述 | 时间复杂度 |
---|---|---|
push(x) | 在栈顶插入元素x | O(1) |
pop() | 弹出栈顶元素 | O(1) |
top() | 返回栈顶元素 | O(1) |
empty() | 检查栈是否为空 | O(1) |
size() | 放回栈中元素的个数 | O(1) |
如果将一个数组的元素依次放入栈,再依次取出,则可以将数组翻转.
2.3.代码示例
#include <bits/stdc++.h>
using namespace std;
int main(){
stack<int> mystack;
mystack.push(10);
mystack.push(20);
mystack.push(30);
mystack.push(40);
cout << "栈顶元素: " <<mystack.top() << '\n';
mystack.pop();//弹出栈顶
cout << "再次获取栈顶元素: " <<mystack.top() << '\n' ;
//检查是否为空
if(mystack.empty()) cout << "栈为空" << '\n';
else cout << "栈不为空" <<'\n';
//获取栈的大小
cout << "栈的大小: " << mystack.size();
return 0;
}