队列、栈、堆的区别与联系并用Python实现
1. 引言
我们先来谈一谈线性表,毕竟栈(堆栈)和队列是两种操作受限的线性表,堆就是树了。
线性表:
线性表是一种线性结构,它是一个含有n≥0个结点的有限序列,同一个线性表中数据元素类型相同并且满足“一对一”的逻辑关系。
“一对一”的逻辑关系是指:
- 对于其中的结点,有且仅有一个开始结点没有前驱&但有一个后继结点
- 有且仅有一个终端结点没有后继&但有一个前驱节点
- 其余所有的结点都有且仅有一个前驱和后继
2. 队列和栈
2.1 原理和特点
队列和栈都是线性结构,队列(stack)为先进后出,栈(queue)为先进后出,我们通过它们的结构来看一下:
![image-20210116041318705](https://cdn.jsdelivr.net/gh/szxczyc/pic-speed@master/image-20210116041318705.png)
![image-20210116041400738](https://cdn.jsdelivr.net/gh/szxczyc/pic-speed@master/image-20210116041400738.png)
- 栈的插入和删除操作只允许在尾端进行,栈中称为:栈顶,也满足FIFO(First in Last Out)
- 队列的只允许在队尾插入数据,在队头删除数据,也满足FIFO(First in Last Out)
2.2 实现
2.2.1 栈的实现一:列表
List列表是Python中的基础数据结构,我们可以使用List的append()
和pop()
方法来模拟入栈、出栈操作。
stack = [] # 模拟一个栈
# 入栈
stack.append(2)
print(stack)
stack.append(4)
print(stack)
stack.append(6)
print(stack)
# 查看栈顶元素
top = stack[-1]
print('栈顶元素为:{}'.format(top))
# 出栈
for i in range(len(stack)):
t = stack.pop()
print('出栈元素为:',t)
if not stack:
print('此时栈为:[空]')
else:
print('此时栈中还有 {} 个元素'.format(len(stack)))
# 输出
[2]
[2, 4]
[2, 4, 6]
栈顶元素为:6
出栈元素为: 6
此时栈中还有 2 个元素
出栈元素为: 4
此时栈中还有 1 个元素
出栈元素为: 2
此时栈为:[空]
入栈顺序为2、4、6,出栈顺序为6、4、2,符合栈的特性:先入后出。
2.2.2 栈的实现二:双向队列
Python