Python模拟 栈 队列 的操作记录(未完待续)

栈:数据是后进先出 (LIFO)     last in first out

队列:数据是先进先出 (FIFO)  first in first out

第一种就是列表:(既可以模拟栈也可以模拟队列)一好以差。

列表是一种容器序列,而且在模拟栈操作的时候,速度也是比较可以的。

在模拟栈操作时,必须用append于pop。(模拟栈的时候,性能优秀)

In [228]: ll = list()                                                                   

In [229]: ll.append('任务1')                                                            

In [230]: ll.append('任务2')                                                            

In [231]: ll.append('任务3')                                                            

In [232]: ll.pop(0)                                                                     
Out[232]: '任务1'

In [233]: ll.pop(0)                                                                     
Out[233]: '任务2'

In [234]: ll.pop(0)                                                                     
Out[234]: '任务3'

 这样的模拟操作队列效率是非常低的,因为你每次移出第一个元素,后面的元素索引都会发生变化

专业的说法需要的时间为O(n)

第二个为collections.deque,这个一个模拟栈于队列都非常优秀的容器序列。

除了随机访问该对象中间的元素的性能很差,耗时为O(n),但一半操作容器序列,很少取访问中间元素。

模拟栈操作:

In [235]: from collections import deque                                                 

In [236]: q = deque?                                                                    
Init signature: deque(self, /, *args, **kwargs)
Docstring:     
deque([iterable[, maxlen]]) --> deque object

A list-like sequence optimized for data accesses near its endpoints.
File:           /usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/collections/__init__.py
Type:           type
Subclasses:     

In [237]: q = deque()                                                                   

In [238]: q.append('任务1')                                                             

In [239]: q.append('任务2')                                                             

In [240]: q.append('任务3')                                                             

In [241]: q.pop()                                                                       
Out[241]: '任务3'

In [242]: q.pop()                                                                       
Out[242]: '任务2'

In [243]: q.pop()                                                                       
Out[243]: '任务1'

In [244]: q                                                                             
Out[244]: deque([])

 模拟队列操作:

In [246]: q.append('任务1')                                                             

In [247]: q.append('任务2')                                                             

In [248]: q.append('任务3')                                                             

In [249]: q                                                                             
Out[249]: deque(['任务1', '任务2', '任务3'])

In [250]: q.popleft()                                                                   
Out[250]: '任务1'

In [251]: q.popleft()                                                                   
Out[251]: '任务2'

In [252]: q.popleft()                                                                   
Out[252]: '任务3'

上面两个是即可以模拟栈,又可以模拟队列的容器序列,下面介绍的是只能单一模拟栈或者队列的。

queue.LifoQueue从字面就可以看出来是模拟栈的,后进先出。queue模块下的容器序列,提供了锁语句来支持多个并发的生产者于消费者。模块下面的很多类的实例一般用在线程间的通讯。

猜你喜欢

转载自www.cnblogs.com/sidianok/p/12071123.html
今日推荐