Day10
文章目录
栈与队列
1. 栈与队列的实现
1.1Python实现栈
使用列表是最简单的方法~
- 列表实现:
- 列表的
append()
和pop()
都默认是在列表尾部进行操作,因此可以模仿栈的先进后出,栈的底部相当于列表的头部(0索引处),栈的顶部相当于列表的尾部。 - 举例:
- 双端队列实现栈
- collections.deque双端队列,底层实现为双向链表,在左右两端插入或删除复杂度都是O(1)
- 举例
- queue.LifoQueue
(暂未使用过)
- queue模块中的LifoQueue类是一个线程安全的栈实现,适用于需要线程安全的场景。
1.2 Python实现队列
- 使用双端队列实现
- collections.deque是双端队列,可以高效地在两端插入和删除元素,因此非常适合用于实现队列。
append
和popleft
操作都是O(1)时间复杂度。 - 举例
- queue.Queue
(暂未使用过)
- queue.Queue是Python标准库提供的线程安全的队列实现,适合多线程环境下使用。
1.3 C++实现栈
关于C++底层实现的前置知识
- 什么是C++标准库
C++语言的官方标准提供的一组标准化的库,它提供了丰富的功能和工具,用于开发各种类型的应用程序。C++标准库包含了多个模块,其中包括常用的容器、算法、迭代器、输入输出操作、字符串处理、时间处理、数学函数等等。 - C++标准库包括哪些:
- STL (Standard Template Library)标准模板库包括什么
- STL主要由以下几个核心组件构成:
容器(Containers)
算法(Algorithms)
迭代器(Iterators)
函数对象(Function Objects or Functors)
配接器(Adapters) - 容器有:
顺序容器:vector deque list array forward_list
关联容器:set multiset map multimap
无序容器:unordered_set unordered_multiset unordered_map unordered_multimap
- 算法有:
排序算法:sort stable_sort
查找算法:find binary_search
修改算法:copy transform fill
集合算法:set_union set_intersection
其他算法:accumulate adjacent_find count
- 迭代器有:
输入迭代器(Input Iterator):只读,支持一次遍历。
输出迭代器(Output Iterator):只写,支持一次遍历。
前向迭代器(Forward Iterator):支持多次遍历,只读或只写。
双向迭代器(Bidirectional Iterator):支持向前和向后遍历。
随机访问迭代器(Random Access Iterator):支持常数时间的随机访问。 - 函数对象有:
函数对象是重载了operator()的对象,可以像函数一样调用。STL中广泛使用函数对象来提供定制的行为。例如,std::less和std::greater是两个常用的函数对象,用于比较两个值。 - 配接器有:
配接器是对其他组件的修改或包装,以改变其接口或行为。STL中有三种类型的配接器。
容器配接器:如stack、queue、priority_queue。
迭代器配接器:如reverse_iterator、back_insert_iterator、front_insert_iterator、insert_iterator。
函数配接器:如std::bind、std::function。
so C++中 stack并不是一个容器,它是标准模版库STL提供的一种容器配接器(也就是对容器的接口进行了改装,container adapter),在SGI版本的STL中(SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现),默认stack的底层是由双端队列deque实现的。也可以人为指定其他实现方式,比如用list 或者vector。
- 导入头文件
#include <stack>
- 创建栈:需要指定存储元素的类型
std::stack<int> myStack;
- 压入元素:使用 push() 方法将元素压入栈顶。
myStack.push(10);
myStack.push(20);
myStack.push(30);
- 访问栈顶元素:使用 top() 方法来访问栈顶元素,但不会将其从栈中删除。
int topElement = myStack.top();
- 弹出栈顶元素:使用 pop() 方法来删除栈顶元素。
myStack.pop();
- 检查栈是否为空:使用 empty() 方法来检查栈是否为空
if (myStack.empty()) {
// 栈为空
} else {
// 栈不为空
}
- 获取栈的大小:使用 size() 方法来获取栈中元素的个数。
int stackSize = myStack.size();
1.4 C++实现队列
与栈类似,他也是个容器适配器
#include <iostream>
#include <queue>
int main() {
std::queue<int> myQueue;
// 入队
myQueue.push(10);
myQueue.push(20);
myQueue.push(30);
// 访问和输出队首元素
std::cout << "Front element: " << myQueue.front() << std::endl;
// 出队
myQueue.pop();
// 检查队列是否为空
if (!myQueue.empty()) {
std::cout << "Queue is not empty" << std::endl;
}
// 获取队列的大小
std::cout << "Queue size: " << myQueue.size() << std::endl;
return 0;
}
2. 栈实现队列(力扣232)
- 题目描述:栈描述队列
(待更新)
3. 队列实现栈(力扣)
- 题目描述:队列实现栈
(待更新)