数据基础结构 9_第1页
数据基础结构 9_第2页
数据基础结构 9_第3页
数据基础结构 9_第4页
数据基础结构 9_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

郭炜信息科学技术学院数据结构与算法

(Python描述)课程信息教材数据结构与算法(Python语言实现)郭炜编著清华大学出版社另有Java语言实现,C/C++语言实现两本,均已经由清华大学出版社出版队列3队列的概念和实现信息科学技术学院美国黄石公园类似于排队,只能一头进,另一头出,

先进先出支持四种操作:

front() 返回队头元素

push(x) 将x添加到队尾

pop() 弹出队头元素,也叫出列

isEmpty() 看队列是否为空要求上面操作复杂度都是O(1)5队列的概念队列的实现顺序表和链表都可以实现队列。优先考虑顺序表队列的实现方法一用足够大的列表实现,维护一个队头指针和队尾指针,初始:front=rear=0371458frontrearqueuefront指向队头元素,rear指向队尾元素的后面push(x)的实现:

queue[rear]=x rear+=1pop()的实现:

front+=1 判断队列是否为空: front==rear队列的实现方法二★如果不想浪费空间开足够大的列表,而是想根据实际情况分配空间,则可以用列表+头尾循环法实现循环队列预先开设一个capacity个空元素的列表queue,front=rear=0列表没有装满的情况下:

push(x)的实现:

queue[rear]=x rear=(rear+1)%capacitypop()的实现:

front=(front+1)%capacitycapacity可以是4,8,16.....队列的实现方法二3)如何判断队列是否为空:

方法1:维护一个元素总数size,size==0即为空

方法2:不维护size,浪费queue中一个单元的存储空间front==rear即为空4)如何判断队列是否为满:

方法1:维护一个元素总数size,size==capacity即为满

方法2:不维护size,浪费queue中一个单元的存储空间, (rear+1)%capacity==front即为满

如果不浪费,就无法区分front==rear

是队列空导致,还是队列满导致队列的实现方法二4)若一个push操作后导致列表满:1.建一个大小是原列表k倍大的新列表(k>1,可以取1.5,2.....)2.将原列表内容全部拷贝到新列表,作为新队列3.重新设置新列表的front和rear4.原列表空间自动被Python解释器回收队列的实现方法二4)若一个push操作后导致列表满:导致队列满的push的时间复杂度是O(n)。平均push操作是O(1)Python列表append做到O(1)的实现也是这种原理,且k取1.125,空间换时间若每次增加空间只增加固定数量,比如20个单元,则push平均复杂度还是O(n)队列的实现方法二classQueue: _initC=8 #存放队列的列表的初始容量

_expandFactor=1.5#扩充容量时容量增加的倍数

def__init__(self): self._q=[Noneforiinrange(Queue._initC)] self._size=0 #队列元素个数

self._capacity=Queue._initC#队列最大容量

self._front=self._rear=0 defisEmpty(self): returnself._size==0 deffront(self):#看队头元素。空队列导致re ifself._size==0: raiseException("Queueisempty") returnself._q[self._front]队列的实现方法二 defback(self):#看队尾元素,空队列导致re ifself._size==0: raiseException("Queueisempty") ifself._rear>0: returnself._q[self._rear-1] else: returnself._q[-1]队列的实现方法二 defpush(self,x): ifself._size==self._capacity: tmp=[Noneforiinrange( int(self._capacity*Queue._expandFactor))] k=0 whilek<self._size: tmp[k]=self._q[self._front] self._front=(self._front+1)%self._capacity k+=1 self._q=tmp#原来self._q的空间会被Python自动释放

self._q[k]=x self._front,self._rear=0,k+1 self._capacity=int( self._capacity*Queue._expandFactor) else: self._q[self._rear]=x self._rear=(self._rear+1)%self._capacity self._size+=1队列的实现方法二 defpop(self): ifself._size==0: raiseException("Queueisempty") self._size-=1 self._front=(self._front+1)%len(self._q)q=Queue()foriinrange(1,314): q.push(i) print(q.back(),end=",")print()whilenotq.isEmpty(): print(q.front(),end=",") q.pop()例题:用两个栈实现一个队列执行push(x)操作时,将x压入栈inStack,执行pop()或front()操作时,看另一个栈outStack是否为空,若不为空,弹出栈顶元素或访问栈顶元素即可;若为空,则先将inStack中的全部元素弹出并依次压入outStack,然后再弹出或访问outStack的栈顶元素。如果将所有元素入栈后都出栈,则每个元素出入inStack一次,出入outStack一次,所以pop、push、front操作的平均复杂度是O(1)的Python中的队列collections库中的deque是双向队列,可以像普通列表一样访问,且在两端进出,复杂度都是O(1)importcollectionsdq=collections.deque()dq.append('a')#右边入队dq.appendleft(2)#左边入队dq.extend([100,200])#右边加入100,200dq.extendleft(['c','d'])#左边依次加入'c','d'print(dq.pop())#>>200右边出队print(dq.popleft())#>>d左边出队print(dq.count('a'))#>>1dq.remove('c')print(dq) #>>deque([2,'a',100])dq.reverse()print(dq) #>>deque([100,'a',2])print(dq[0],dq[-1],dq[1])#>>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论