栈(stack)是线性表的一个具体形式,其定义是一个后进先出的线性表,它要求只在表尾进行进行删除和插入操作。
栈的插入操作叫做进栈(push),删除操作叫做出栈(pop)。栈的本质仍是一个线性表,因此栈也分为顺序储存和链式储存两种。
![7a17945638715c4c438059db05be4df0.png](https://i-blog.csdnimg.cn/blog_migrate/fc505b491c7ec094efd14c0cd72bb525.jpeg)
存储结构
- base:指向栈底的指针
- top:指向栈顶的指针
- stackSize:当前可使用的最大容量
代码实现
栈
class
这是网上常见的python中栈的写法,但是我觉得有些取巧,所以换了一个
class
队列(queue)是只允许在一端进行插入操作,另一端进行删除操作的线性表。与栈相反,队列是先进先出的线性表。
与栈不同,队列通常用链式储存结构,因此需要给出队头和队尾两个指针。
创建一个队列需要完成两个任务:一是创建一个头结点,二是将队列的头指针和尾指针指向这个头结点。
入队流程:
![37c18f4e09fb29933c95c67a9fa0ad45.png](https://i-blog.csdnimg.cn/blog_migrate/f5b781b4dc116ece753b2b79a4be1964.jpeg)
出队流程:
![f00876ad48640c58544b5fe45c6943cd.png](https://i-blog.csdnimg.cn/blog_migrate/219d19c7b05d3f6bbf3459e6cd49e4dd.jpeg)
另一种方式就是使用顺序存储,这种情况下使用数组来表示一个队列,出队和入队就是更改队头和队尾位置的元素。
循环队列:不固定队头位置的顺序队列,不断进行出队和入队操作会造成假溢出(逻辑溢出),为了解决这个问题,采用循环队列,即一个头尾相接的环形对列。 当队头队尾指针的位置超出范围后,需要自动调整到新的位置从头开始,实现这种效果的方式是对数组下标进行取模。
代码实现
链式队列
class
循环队列
class