对于我的任务我应该制作一个deque类,让人们从正面和背面插入,并且能够从正面和背面移除,这些是Deque类中的4个独立函数
如果我使用insert_front,那么我可以使用remove_front从队列中删除所有内容,但是如果我使用insert_front并尝试使用remove_rear,那么我的程序在执行remove_rear一次后会中断,它将删除后面,但如果我尝试为了移除下一个后部,程序中断,因为它不知道下一个后节点是什么,我不知道如何能够跟踪前后两者,所以我可以互换地使用这些功能。使用insert_rear和remove_front也可以反过来这样做。
我的Deque类代码如下:
def insert_front( self, value ):
if self._rear==None and len(self)==1:
node = _DequeNode(value, self._front,self._rear)
self._front = node
self._rear=node
else:
node = _DequeNode(value, self._front,self._rear)
self._front = node
self._size += 1
return
def insert_rear( self, value ):
node = _DequeNode(value, self._front,self._rear)
self._rear = node
if self._front==None and len(self)==2:
self._front=node
self._size += 1
return
def remove_front( self ):
if self.is_empty():
value = None
else:
current = self._front
value = current._value
self._front = current._next
self._size -= 1
return value
def remove_rear( self ):
if self.is_empty():
value = None
else:
current = self._rear
value = current._value
self._rear = current._prev
self._size -= 1
return value
这是我的_DequeNode类:
def __init__(self, value, next_node,prev_node):
self._value = copy.deepcopy(value)
self._next = next_node
self._prev = prev_node
return
我在更改代码时肯定做错了,因为这最初只是用于链接列表,你只能从前面删除和插入,老师要求我们把它变成一个前后都有的Deque ,我根据我认为应该发生的事情编辑了代码。
有人可以帮我这个吗?我一整天都试图解决这个问题! 在此先感谢!!
答案 0 :(得分:0)
这是我写得很快的工作版本。
此外,我添加了__repr__
方法,以便您可以看到正在发生的事情(除了您还修改__repr__
以便能够采用__init__
之外,这实际上不是一个好习惯输出作为参数。
您可能还想查看https://github.com/python-mirror/python/blob/master/Modules/_collectionsmodule.c - 其中包含python deque
实现。
class DQ:
def __init__(self):
self._front = self._rear = None
self._size = 0
def insert_front( self, value ):
self._front = DequeNode(value, prev=self.front)
if self.size > 0:
self.front.prev._next = self._front
else:
self._rear = self._front
self._size += 1
def insert_rear( self, value ):
self._rear = DequeNode(value, next=self.rear)
if self.size > 0:
self.rear.next._prev = self._rear
else:
self._front = self._rear
self._size += 1
def pop_front( self ):
if self.empty:
raise IndexError("deque is empty")
else:
ret = self._front
self._size -= 1
self._front = self._front.prev
if self.front:
self.front._next = None
if self.size == 0:
self._front = None
return ret
def pop_rear( self ):
if self.empty:
raise IndexError("deque is empty")
else:
ret = self._rear
self._size -= 1
self._rear = self._rear.next
if self.rear:
self.rear._prev = None
if self.size == 0:
self._front = None
return ret
@property
def empty(self):
return self._size == 0
@property
def size(self):
return self._size
@property
def front(self):
return self._front
@property
def rear(self):
return self._rear
def __str__(self):
cur = self.rear
l = []
for i in range(self.size):
l.append(cur)
cur = cur.next
return str(l)
def __repr__(self):
return self.__str__()
class DequeNode:
def __init__(self, value=None, next=None, prev=None):
self._value = value
self._next =next
self._prev = prev
@property
def prev(self):
return self._prev
@property
def next(self):
return self._next
def __str__(self):
return str(self._value)
def __repr__(self):
return str("DequeNode( %s )" %self._value)