Skip to content

Commit 216cd17

Browse files
committed
栈、树、图、队列等
1 parent 3216d27 commit 216cd17

File tree

18 files changed

+345
-1
lines changed

18 files changed

+345
-1
lines changed

Deque/deque.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Created by imoyao at 2019/6/10 18:57
4+
5+
6+
class Deque:
7+
"""模拟双端队列"""
8+
9+
def __init__(self):
10+
self.items = []
11+
12+
def isEmpty(self):
13+
return self.items == []
14+
15+
def addFront(self, item):
16+
"""
17+
队首添加
18+
:param item:
19+
:return:
20+
"""
21+
self.items.append(item)
22+
23+
def addRear(self, item):
24+
"""
25+
队尾添加
26+
:param item:
27+
:return:
28+
"""
29+
self.items.insert(0, item)
30+
31+
def removeFront(self):
32+
"""
33+
队首移除
34+
:return:
35+
"""
36+
if not self.isEmpty():
37+
return self.items.pop()
38+
39+
def removeRear(self):
40+
"""
41+
队尾移除
42+
:return:
43+
"""
44+
if not self.isEmpty():
45+
return self.items.pop(0)
46+
47+
def size(self):
48+
return len(self.items)
49+
50+
51+
if __name__ == '__main__':
52+
d = Deque()
53+
print(d.isEmpty())
54+
d.addRear(4)
55+
d.addRear('dog')
56+
d.addFront('cat')
57+
d.addFront(True)
58+
print(d.size())
59+
print(d.isEmpty())
60+
d.addRear(8.4)
61+
print(d.removeRear())
62+
print(d.removeFront())

Deque/readme.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# 双端队列
2+
3+
## 概念
4+
双端队列(Deque),是一种类似于队列的元素的有序集合。它拥有两端,队首和队尾,并且元素保持在当前的位置。双端队列的一个不同点就是,添加和删除元素的位置不受限制。新元素可以在队首或者队尾添加。同样地,双端队列中的元素可以从两端弹出。在某种意义上,这种混合的线性结构同时具有栈和队列的性质。
5+
6+
## 操作
7+
Deque() 创建一个空的双端队列,无参数,返回值是空队列。
8+
add_front(item) 在队首添加入一个元素,参数是数据项,无返回值。
9+
add_rear(item) 在队尾添加入一个元素,参数是数据项,无返回值。
10+
remove_front() 删除队首的元素,不需要参数,返回值是被删除的元素,队列本身有变化。
11+
remove_rear() 删除队尾的元素,不需要参数,返回值是被删除的元素,队列本身有变化。
12+
is_Empty() 检测队列是否为空。无参数,返回布尔值。
13+
size() 返回队列元素的个数。无参数,返回一个整数。

Graph/readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#
2+
3+
## 概念
4+
5+
6+
## 更多

Hash/readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# 散列
2+
3+
## 概念
4+
5+
6+
## 更多

Heap/readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#
2+
3+
## 概念
4+
5+
6+
## 更多

Queue/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Created by imoyao at 2019/6/10 18:39

Queue/hot_potato/hot_potato.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# Created by imoyao at 2019/6/10 18:34
4+
import pathlib
5+
import sys
6+
7+
util_p = pathlib.Path('../').resolve()
8+
sys.path.append(str(util_p))
9+
from queue import Queue
10+
11+
12+
def hot_potato(name_lists, num): # TODO:待验证
13+
"""
14+
假设拿着土豆的孩子位于队首,当开始传递土豆时,模拟器会将那个孩子从队首移出队列然后立即让他从队尾进入队列。所有在他前面的人都
15+
轮过一遍后才会再次轮到他传土豆。每经过'num'次出队入队的过程后,站在队首的孩子就会永久离开队列,游戏将在新的圆圈中继续进行。
16+
这个过程会一直持续到只有一个名字剩下(即队列大小为 1 时)。
17+
:param name_lists: 玩游戏的人员名称
18+
:param num: 计数的出列标志
19+
:return:
20+
"""
21+
sq = Queue()
22+
for user in name_lists: # 全部入队
23+
sq.enqueue(user)
24+
25+
while sq.size() > 1: # 最后剩下一个元素
26+
for i in range(num):
27+
sq.enqueue(sq.dequeue()) # 计数过的元素,重新插入队尾,继续新一轮的计数
28+
29+
sq.dequeue() # 每次计数完成,该元素出队
30+
return sq.dequeue() # 弹出元素名称
31+
32+
33+
if __name__ == '__main__':
34+
print(hot_potato(["Bill", "David", "Susan", "Jane", "Kent", "Brad"], 7))

Queue/hot_potato/readme.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#烫手山芋问题/约瑟夫环问题
2+
3+
## 概念
4+
5+
> 6个小孩子们围成一个圆圈并以最快的速度接连传递手中的土豆,并在游戏的一个特定时刻停止传递,这时手中拿着物
6+
品的小孩就离开圆圈,游戏进行至只剩下一个小孩。
7+
8+
> 这个故事是关于公元 1 世纪著名历史学家Flavius Josephus 的,传说在犹太民族反抗罗马统治的战争中, Josephus 和他的 39 个同胞在一个洞穴中与罗马人相对抗。当注定的失败即将来临之时,他们决定宁可死也不投降罗马。于是他们围成一个圆圈,其中一个人被指定为第一位然后他们按照顺时针进行计数, 每数到第七个人就把他杀死。传说中 Josephus 除了熟知历史之外还是一个精通于数学的人。他迅速找出了那个能留到最后的位置。最后一刻,他没有选择自杀而是加入了罗马的阵营。
9+
10+
11+
## 更多
12+
[队列与约瑟夫问题](https://blog.csdn.net/python2014/article/details/21231985)

Queue/img/queue-example.jpg

157 KB
Loading

Queue/img/queue.png

16.9 KB
Loading

0 commit comments

Comments
 (0)