队列是一种比较重要的数据结构,其特点是FIFO先进先出,操作系统中的任务调度就是利用了队列,不过那是一种通过构建最大堆实现的优先队列。这里我们只讨论比较常见的一种队列,循环队列。循环队列就像一个转盘一样,head和end分别指向队头和队尾,先加入的元素放到队尾,出队在对头。
首先还是需要定义一个队列的接口,当然我们这样做事为了以后其他实现方式的队列的需求
class IQueue: __metaclass__=ABCMeta @abstractmethod def Append(self,element):pass @abstractmethod def Delete(self):pass @abstractmethod def Front(self):pass @abstractproperty def IsEmpty(self):pass @abstractproperty def Length(self):pass @abstractmethod def Display(self):pass
队列具有基本的入队,出队,查看对头等
class CycleQueue(IQueue): __defalutSize=10#queue‘s default size __size=0 __rear,__front,__count=0,0,0 __data=[] def __init__(self,size=None): if size<>None: self.__size=size else: self.__size=self.__defalutSize for i in range(size): self.__data.append(None) def Append(self,element): if(self.__count>0 and self.__front==self.__rear): raise Exception('队列已满') self.__data[self.__rear]=element self.__rear=(self.__rear+1)%self.__size self.__count+=1 def Delete(self): if(self.__count==0): raise Exception('队列已空') temp=self.__data[self.__front] self.__front=(self.__front+1)%self.__size self.__count-=1 return temp def Front(self): if(self.__count==0): raise Exception('队列已空') return self.__data[self.__front] def IsEmpty(self): if(self.__count==0): return True return False def Length(self): return self.__count def Display(self): str1=[] if(self.__count>0): str1.append(self.__data[self.__front]) i=(self.__front+1)%self.__size while(i<>self.__rear): str1.append(self.__data[i]) i=(i+1)%self.__size return str1
对于队列,其要注意队列的队头和队尾指针的关系,每次入队和出队都需要对队头和队尾指针和 队列大小size取模操作,进行循环。