[代码随想录算法训练营Day10 栈与队列Part1]

Day10

栈与队列

1. 栈与队列的实现

1.1Python实现栈

使用列表是最简单的方法~

  1. 列表实现:
  • 列表的append()pop()都默认是在列表尾部进行操作,因此可以模仿栈的先进后出,栈的底部相当于列表的头部(0索引处),栈的顶部相当于列表的尾部。
  • 举例:
    在这里插入图片描述
  1. 双端队列实现栈
  • collections.deque双端队列,底层实现为双向链表,在左右两端插入或删除复杂度都是O(1)
  • 举例
    在这里插入图片描述
  1. queue.LifoQueue
    (暂未使用过)
  • queue模块中的LifoQueue类是一个线程安全的栈实现,适用于需要线程安全的场景。
    在这里插入图片描述
1.2 Python实现队列
  1. 使用双端队列实现
  • collections.deque是双端队列,可以高效地在两端插入和删除元素,因此非常适合用于实现队列。appendpopleft操作都是O(1)时间复杂度。
  • 举例
    在这里插入图片描述
  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中有三种类型的配接器。
    容器配接器:如stackqueue、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。
在这里插入图片描述


  1. 导入头文件
#include <stack>
  1. 创建栈:需要指定存储元素的类型
std::stack<int> myStack;
  1. 压入元素:使用 push() 方法将元素压入栈顶。
myStack.push(10);
myStack.push(20);
myStack.push(30);
  1. 访问栈顶元素:使用 top() 方法来访问栈顶元素,但不会将其从栈中删除。
int topElement = myStack.top();
  1. 弹出栈顶元素:使用 pop() 方法来删除栈顶元素。
myStack.pop();
  1. 检查栈是否为空:使用 empty() 方法来检查栈是否为空
if (myStack.empty()) {
    // 栈为空
} else {
    // 栈不为空
}
  1. 获取栈的大小:使用 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)

  1. 题目描述:栈描述队列
    (待更新)

3. 队列实现栈(力扣)

  1. 题目描述:队列实现栈
    (待更新)
  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值