关闭

Python数据结构——队列(1)

标签: python数据结构队列
228人阅读 评论(0) 收藏 举报
分类:

队列(queue)这一数据结构非常适合那些数据按照其被接收的顺序处理的问题。如共享打印机。队列可以被看做一个先进先出的(FIFO)list.
下图为一个队列结构
这里写图片描述

有多种方式来实现一个队列:list,linked list,array都可以。首先看一个list实现的队列
1、用python list实现队列

class Queue :
 # Creates an empty queue.
 def __init__( self ):
  self._qList = list()

# Returns True if the queue is empty.
 def isEmpty( self ):
  return len( self ) == 0

 # Returns the number of items in the queue.
 def __len__( self ):
  return len( self._qList )

 # Adds the given item to the queue.
 def enqueue( self, item ):
  self._qList.append( item )

 # Removes and returns the first item in the queue.
 def dequeue( self ):
  assert not self.isEmpty(), "Cannot dequeue from an empty queue."
  return self._qList.pop( 0 )

下面是队列的使用和控制台输出:

myQueue = Queue()
myQueue.enqueue("apple")
myQueue.enqueue("1000")
myQueue.enqueue("机器")

print(len(myQueue))
myQueue.dequeue()
print(myQueue.isEmpty())

这里写图片描述

使用list实现的队列在入队和出队时由于可能移动元素,最糟糕的情况下所需的时间复杂度为O(n).
我们可以用另一种数据结构–环形数组(circular Array)来改善这种情况。环形数组仍然是一个数组,只不过被视作一个圆环而不是一条线。如图:
这里写图片描述

环形数组可以允许我们添加或删除现有数据的情况下不必按顺序移动元素。但环形数据有一个最大容量(maximum-capacity),所以环形数组适合处理数据量不大的问题。
2、用环形数组实现队列(引用的Array在本文最后)

from myArray import Array
class Queue2 :
 # Creates an empty queue.
 def __init__( self, maxSize ) :
  self._count = 0
  self._front = 0
  self._back = maxSize - 1
  self._qArray = Array( maxSize )

 # Returns True if the queue is empty.
 def isEmpty( self ) :
  return self._count == 0

 # Returns True if the queue is full.
 def isFull( self ) :
  return self._count == len(self._qArray)

 # Returns the number of items in the queue.
 def __len__( self ) :
  return self._count

 # Adds the given item to the queue.
 def enqueue( self, item ):
  assert not self.isFull(), "Cannot enqueue to a full queue."
  maxSize = len(self._qArray)
  self._back = (self._back + 1) % maxSize
  self._qArray[self._back] = item
  self._count += 1

 # Removes and returns the first item in the queue.
 def dequeue( self ):
  assert not self.isEmpty(), "Cannot dequeue from an empty queue."
  item = self._qArray[ self._front ]
  maxSize = len(self._qArray)
  self._front = (self._front + 1) % maxSize
  self._count -= 1
  return item

下面是队列的使用和控制台输出

aqueue = Queue2(10)
aqueue.enqueue("orange")
aqueue.enqueue("300")
print("aqueue的长度:%d" %len(aqueue))
aqueue.dequeue()
print("aqueue的长度:%d" %len(aqueue))

这里写图片描述

使用python list实现的队列最大的不足是入队和出队时的时间开销,用环形数组虽然解决了这个不足,但环形数组容量有大小限制。一个更好的解决方法是使用链表,如图
这里写图片描述

class Queue3:

 def __init__(self):
  self._qhead = None
  self._qtail = None
  self._count = 0

 def __len__(self):
  return self._count

 def isEmpty(self):
  return self._qhead is None

 def enqueue(self,item):
   node = _QueueNode(item)
   if self.isEmpty():
    self._qhead = node
   else:
    self._qtail.next = node #新的节点链到tail的next

   self._qtail = node #新的节点成为新tail
   self._count += 1



 def dequeue(self):
  assert not self.isEmpty(), "buneng"
  node = self._qhead
  if self._qhead is self._qtail:
   self._qtail = None
  else:
   self._qhead = self._qhead.next
  self._count -= 1
  return node.item

class _QueueNode(object):
 def __init__(self, item):
  self.item = item
  self.next = None

队列的使用和控制台输出

anoqueue = Queue3()
anoqueue.enqueue("banana")
anoqueue.enqueue("咖啡")
print("anoqueue长度是%d" %len(anoqueue))
print(anoqueue.dequeue())

这里写图片描述

myArray.py

import ctypes

class Array :
 # Creates an array with size elements.
 def __init__( self, size ):
  assert size > 0, "Array size must be > 0"
  self._size = size
 # Create the array structure using the ctypes module.
  PyArrayType = ctypes.py_object * size
  self._elements = PyArrayType()
 # Initialize each element.
  self.clear( None )

 # Returns the size of the array.
 def __len__( self ):
  return self._size

 # Gets the contents of the index element.
 def __getitem__( self, index ):
  assert index >= 0 and index < len(self), "Array subscript out of range"
  return self._elements[ index ]

 # Puts the value in the array element at index position.
 def __setitem__( self, index, value ):
  assert index >= 0 and index < len(self), "Array subscript out of range"
  self._elements[ index ] = value

 # Clears the array by setting each element to the given value.
 def clear( self, value ):
  for i in range( len(self) ) :
   self._elements[i] = value

 # Returns the array's iterator for traversing the elements.
 def __iter__( self ):
  return _ArrayIterator( self._elements )

 # An iterator for the Array ADT.
class _ArrayIterator :
 def __init__( self, theArray ):
   self._arrayRef = theArray
   self._curNdx = 0

 def __iter__( self ):
  return self

 def __next__( self ):
  if self._curNdx < len( self._arrayRef ) :
   entry = self._arrayRef[ self._curNdx ]
   self._curNdx += 1
   return entry
  else :
   raise StopIteration

据 Data Structures and Algorithms Using Python一书整理

0
0
查看评论

环形队列——C语言实现、python实现

环形队列 环形队列
  • u013184096
  • u013184096
  • 2014-07-08 23:08
  • 1611

Python 使用循环数组实现队列 (基于class, 包含迭代器)

Python 使用循环数组实现队列 (基于class, 包含迭代器)
  • guaguastd
  • guaguastd
  • 2015-02-02 17:51
  • 1810

python3队列及循环队列基本实现

class Queue(object):# 定义队列类 为什么加入object def __init__(self,size): self.size = size #定义队列长度 self.queue = []#存储队列 列表 #返回对象的字符串表达式 方...
  • zzy123zzy123_
  • zzy123zzy123_
  • 2017-10-07 15:48
  • 577

python数据结构学习笔记-4-堆栈 队列

堆栈、队列
  • hjh00
  • hjh00
  • 2015-11-02 17:19
  • 1222

用Python实现的数据结构与算法-队列

1.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行。   2.ADT 队列ADT(抽象数据类型)一般提供以下接口:   Queue():创建队列 enqueue(item):向队尾插...
  • CherDW
  • CherDW
  • 2017-02-13 12:37
  • 638

Python笔记——几种数据结构的实现:栈、队列及二叉树

Python笔记 几种数据结构的实现:栈、队列、二叉树
  • wklken
  • wklken
  • 2011-04-11 14:46
  • 24782

【数据结构】队列的基本操作

队列的基本操作.cpp #include using namespace std; typedef int QElemType; typedef int Status; typedef struct QNode {  QElemType data;    ...
  • qq_32353771
  • qq_32353771
  • 2015-11-10 15:05
  • 1492

数据结构 --静态队列 讲解

上次我在 http://blog.csdn.net/nvd11/article/details/8805772 已经解释了链式队列的大概结构和c语言代码实现. 也提到了另一种队列: 静态队列.  其实相对于链式队列来讲. 其实静态队列更加复杂. 1. 什么是...
  • nvd11
  • nvd11
  • 2013-04-19 02:16
  • 1247

数据结构-循环队列的基本操作

题目要求:(1)初始化循环队列q (2)判断循环队列q是否为空 (3)元素a,b,c依次入队(4)出队一个元素,并输出该元素 (5)元素d,e,f依次入队 (6)将队列q中所有元素出队并输出此时的出队序列 (7)释放循环队列q#include usi...
  • weixin_38158043
  • weixin_38158043
  • 2017-11-01 15:28
  • 240

【数据结构】队列的出队和入队操作

队列的操作规则是先进先出,要注意分三种情况,1.队列为空
  • michellechouu
  • michellechouu
  • 2014-06-03 16:01
  • 2203
    个人资料
    • 访问:9439次
    • 积分:358
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条