Deque类插入和移除前后不可互换的工作[python]

时间:2015-02-27 04:44:45

标签: python python-3.x nodes doubly-linked-list deque

对于我的任务我应该制作一个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 ,我根据我认为应该发生的事情编辑了代码。

有人可以帮我这个吗?我一整天都试图解决这个问题! 在此先感谢!!

1 个答案:

答案 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)