赞
踩
队列是一种先进先出(FIFO)的数据结构,因此对队列的操作涉及到队列的头部和尾部。若用python中的顺序表(list)实现,出队用pop(0),入队用append()实现,则删除list头部数据的开小较大,不是一种高效的实现。但可是使用list作为储存队列的空间,实现队列需要一个头部元素位置的引用,以及当前队列的长度。具体实现原理如下:
由上图可以总结出实现的思路:
- #基于顺序表实现的队列
- class SQueue():
- def __init__(self,init_len=8):
- self._len=init_len #容量
- self._elems=[0]*init_len #存储元素的list
- self._head=0 #队头位置
- self._num=0 #队里元素个数
-
- def is_empty(self): #判断队列是否为空
- return self._num==0
-
- def peek(self): #获取队头的元素
- if self.is_empty():
- print("当前队列为空")
- return
- return self._elems[self._head]
-
- def dequeue(self): #出队
- if self.is_empty():
- print("当前队列为空")
- return
- e=self._elems[self._head]
- self._num-=1
- self._head=(self._head+1)%self._len
- return e
-
- def __extend(self): #扩充容量
- old_len=self._len
- self._len*=2
- new_elems=[0]*self._len
- for i in range(old_len):
- new_elems[i]=self._elems[(self._head+i)%old_len]
- self._elems=new_elems
- self._head=0
-
- def enqueue(self,e): #入队
- if self._num==self._len:
- self.__extend()
- self._elems[(self._head+self._num)%self._len]=e
- self._num+=1

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。