leetcode-master/problems/栈与队列理论基础.md

111 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p align="center">
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
<a href="https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
<a href="https://img-blog.csdnimg.cn/20201210231711160.png"><img src="https://img.shields.io/badge/公众号-代码随想录-brightgreen" alt=""></a>
<a href="https://space.bilibili.com/525438321"><img src="https://img.shields.io/badge/B站-代码随想录-orange" alt=""></a>
</p>
<p align="center"><strong>欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
> 来看看栈和队列不为人知的一面
我想栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出。
如图所示:
![栈与队列理论1](https://img-blog.csdnimg.cn/20210104235346563.png)
那么我这里在列出四个关于栈的问题大家可以思考一下。以下是以C++为例,相信使用其他编程语言的同学也对应思考一下,自己使用的编程语言里栈和队列是什么样的。
1. C++中stack 是容器么?
2. 我们使用的stack是属于那个版本的STL
3. 我们使用的STL中stack是如何实现的
4. stack 提供迭代器来遍历stack空间么
相信这四个问题并不那么好回答, 因为一些同学使用数据结构会停留在非常表面上的应用,稍稍往深一问,就会有好像懂,好像也不懂的感觉。
有的同学可能仅仅知道有栈和队列这么个数据结构却不知道底层实现也不清楚所使用栈和队列和STL是什么关系。
所以这里我在给大家扫一遍基础知识,
首先大家要知道 栈和队列是STLC++标准库)里面的两个数据结构。
C++标准库是有多个版本的要知道我们使用的STL是哪个版本才能知道对应的栈和队列的实现原理。
那么来介绍一下三个最为普遍的STL版本
1. HP STL
其他版本的C++ STL一般是以HP STL为蓝本实现出来的HP STL是C++ STL的第一个实现版本而且开放源代码。
2. P.J.Plauger STL
由P.J.Plauger参照HP STL实现出来的被Visual C++编译器所采用,不是开源的。
3. SGI STL
由Silicon Graphics Computer Systems公司参照HP STL实现被Linux的C++编译器GCC所采用SGI STL是开源软件源码可读性甚高。
接下来介绍的栈和队列也是SGI STL里面的数据结构 知道了使用版本,才知道对应的底层实现。
来说一说栈,栈先进后出,如图所示:
![栈与队列理论2](https://img-blog.csdnimg.cn/20210104235434905.png)
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。
**栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。**
所以STL中栈往往不被归类为容器而被归类为container adapter容器适配器
那么问题来了STL 中栈是用什么容器实现的?
从下图中可以看出栈的内部结构栈的底层实现可以是vectordequelist 都是可以的, 主要就是数组和链表的底层实现。
![栈与队列理论3](https://img-blog.csdnimg.cn/20210104235459376.png)
**我们常用的SGI STL如果没有指定底层实现的话默认是以deque为缺省情况下栈的低层结构。**
deque是一个双向队列只要封住一段只开通另一端就可以实现栈的逻辑了。
**SGI STL中 队列底层实现缺省情况下一样使用deque实现的。**
我们也可以指定vector为栈的底层实现初始化语句如下
```
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
```
刚刚讲过栈的特性,对应的队列的情况是一样的。
队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, **SGI STL中队列一样是以deque为缺省情况下的底部结构。**
也可以指定list 为起底层实现初始化queue的语句如下
```
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
```
所以STL 队列也不被归类为容器而被归类为container adapter 容器适配器)。
我这里讲的都是clckC++ 语言中情况, 使用其他语言的同学也要思考栈与队列的底层实现问题, 不要对数据结构的使用浅尝辄止,而要深挖起内部原理,才能夯实基础。
## 其他语言版本
Java
Python
Go
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频[代码随想录](https://space.bilibili.com/525438321)
* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
<div align="center"><img src=../pics/公众号.png width=450 alt=> </img></div>