python.队列:链表存储模型

--从尾入头出

功能实现:

入队:建立两个变量做为头(front)尾(rear)的指针.

self.front=self.rear=Node(None)

初始化时同时指向一个空的结点Node(None),入队开始新建一个有用结点,把front的指针指向这个结点,然后再移动到该结点位置。

例如:幼儿园老师组织孩子们排队放学。两个老师同时到教室门口,一个做队头一个做队尾。开始两个老师都在一个位置,等学生出来,尾老师把第一个学生的手拉过来交给首老师,然后尾老师和第一个学生站在一起,在把第二个学生拉过来交给第一个学生,尾老师又和第二个学生站在一起,以此类推最后尾老师和最后入队的学生站在一起。

出队:出队时只要首老师站在第一个学生位置,第一个学生就出队了。

'''

队列的链式栈

重点代码

思路分析:

1、源于链表结构

2、封装队列的操作方法(入队,出队,是否为空,队顶元素)

3、用链表的开头作为队头,队列的尾部作队列的队尾

4、单独对队尾作标记,避免遍历

5、当除头队尾标记重合的时候认为队列是空

'''

#自定义异常

class StackError(Exception):

pass

#创建节点类

class Node:

'''

思路:将自定义的类视为节点生成类,实例对象中包含

数据部分和指向下一个节点的next

'''

def __init__(self,val,next=None):

self.val=val

self.next=next

#链式队列

class Queue:

def __init__(self):

#定义队头和队尾的变量

self.front=self.rear=Node(None)

def is_empty(self):#判断是否为空

return self.front==self.rear

def enqueue(self, val):#入队rear向后动。

self.rear.next=Node(val)#把新节点挂在rear后面同时也就挂在front上面

self.rear=self.rear.next#把rear向后移动到新节点上

def dequeue(self):#出队

if self.is_empty():

raise StackError("Stack is empty")

else:

#value= self.front.next.val

self.front=self.front.next#认为front指向的节点已经出队,

return self.front.val

def top(self):

if self.is_empty():

raise StackError("Stack is empty")

return self.front.next.val

def show(self):#输出队列(测试有问题)

p = self.front.next

while not self.is_empty():

print(p.val,end=" ")

p = p.next

#测试:

if __name__=="__main__":

l=Queue()

l.enqueue(1)

l.enqueue(2)

l.enqueue(3)

l.enqueue(4)

l.enqueue(5)

print(l.dequeue())

print(l.top())

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章