예제 #1
0
class StackAsLinkedList(Stack):
    """
    Stack implemented using a linked list.
    """

    #}@head

    #{

    # ...
    #}@tail

    #{
    def __init__(self):
        """
        (StackAsLinkedList)
        Constructs a stack.
        """
        super(StackAsLinkedList, self).__init__()
        self._list = LinkedList()

    def purge(self):
        """
        (StackAsLinkedList) -> None
        Purges this stack.
        """
        self._list.purge()
        self._count = 0
#}>a

#{

    def push(self, obj):
        """
        (StackAsLinkedList, Object) -> None
        Pushes the given object on to this stack.
        """
        self._list.prepend(obj)
        self._count += 1

    def pop(self):
        """
        (StackAsLinkedList) -> None
        Pops the top object off this stack.
        """
        if self._count == 0:
            raise ContainerEmpty
        result = self._list.first
        self._list.extract(result)
        self._count -= 1
        return result

    def getTop(self):
        """
        (StackAsLinkedList) -> None
        Returns the object at the top of this stack.
        """
        if self._count == 0:
            raise ContainerEmpty
        return self._list.first
#}>b

#{

    def accept(self, visitor):
        """
        (StackAsLinkedList, Visitor) -> None
        Makes the given visitor visit all the objects in this stack.
        """
        assert isinstance(visitor, Visitor)
        ptr = self._list.head
        while ptr is not None:
            visitor.visit(ptr.datum)
            if visitor.isDone:
                return
            ptr = ptr.next
#}>c

#{

    class Iterator(Iterator):
        """
        Enumerates the elements of a StackAsLinkedList.
        """
        def __init__(self, stack):
            """
            (StackAsLinkedList.Iterator, StackAsLinkedList) -> None
            Constructs an iterator for the given stack.
            """
            super(StackAsLinkedList.Iterator, self).__init__(stack)
            self._position = stack._list.head

        def next(self):
            """
            (StackAsLinkedList.Iterator) -> Object
            Returns the next element.
            """
            if self._position is None:
                raise StopIteration
            element = self._position
            self._position = self._position.next
            return element.datum

    def __iter__(self):
        """
        (StackAsLinkedList) -> StackAsLinkedList.Iterator
        Returns an iterator for this stack.
        """
        return self.Iterator(self)


#}>d

    def _compareTo(self, obj):
        """
        (StackAsLinkedList, StackAsLinkedList) -> int

        Compares this stack with the given stack.
        """
        assert isinstance(self, obj.__class__)
        raise NotImplementedError

    @staticmethod
    def main(*argv):
        "StackAsLinkedList test program."
        print StackAsLinkedList.main.__doc__
        stack2 = StackAsLinkedList()
        Stack.test(stack2)
        return 0
예제 #2
0
class GeneralTree(Tree):
    """
    A general tree implemented using a linked list of subtrees.
    """

#}@head

#{
    # ...
#}@tail

#{
    def __init__(self, key):
        """
        (GeneralTree, Object) -> None
        Constructs a general tree with the given object at its root.
        """
        super(GeneralTree, self).__init__()
        self._key = key
        self._degree = 0
        self._list = LinkedList()

    def purge(self):
        """
        (GeneralTree) -> None
        Purges this general tree.
        """
        self._list.purge()
        self._degree = 0
#}>a

    def getIsEmpty(self):
        """
        (GeneralTree) -> bool
        Returns false always.
        """
        return False

    def getIsLeaf(self):
        """
        (GeneralTree) -> bool
        Returns true if this general tree is a leaf.
        """
        return self._degree == 0

    def getDegree(self):
        """
        (GeneralTree) -> int
        Returns the degree of this general tree node.
        """
        return self._degree

#{
    def getKey(self):
        """
        (GeneralTree) -> Object
        Returns the key in this general tree node.
        """
        return self._key

    def getSubtree(self, i):
        """
        (GeneralTree) -> Object
        Returns the specified subtree of this general tree node.
        """
        if i < 0 or i >= self._degree:
            raise IndexError
        ptr = self._list.head
        for j in xrange(i):
            ptr = ptr.next
        return ptr.datum

    def attachSubtree(self, t):
        """
        (GeneralTree, GeneralTree) -> None
        Attaches the given general tree as a subtree
        of this general tree node.
        """
        self._list.append(t)
        self._degree += 1

    def detachSubtree(self, t):
        """
        (GeneralTree, GeneralTree) -> GeneralTree
        Detaches and returns specified general tree
        from this general tree node.
        """
        self._list.extract(t)
        self._degree -= 1
        return t
#}>b

    def _compareTo(self, obj):
        """
        (GeneralTree, GeneralTree) -> int

        Compares this general tree with the given general tree.
        """
        assert isinstance(self, obj.__class__)
        raise NotImplementedError

    @staticmethod
    def main(*argv):
        "GeneralTree test program."
        print GeneralTree.main.__doc__
        gt = GeneralTree('A')
        gt.attachSubtree(GeneralTree('B'))
        gt.attachSubtree(GeneralTree('C'))
        gt.attachSubtree(GeneralTree('D'))
        gt.attachSubtree(GeneralTree('E'))
        Tree.test(gt)
        return 0
예제 #3
0
class GeneralTree(Tree):
    """
    A general tree implemented using a linked list of subtrees.
    """

    #}@head

    #{
    # ...
    #}@tail

    #{
    def __init__(self, key):
        """
        (GeneralTree, Object) -> None
        Constructs a general tree with the given object at its root.
        """
        super(GeneralTree, self).__init__()
        self._key = key
        self._degree = 0
        self._list = LinkedList()

    def purge(self):
        """
        (GeneralTree) -> None
        Purges this general tree.
        """
        self._list.purge()
        self._degree = 0
#}>a

    def getIsEmpty(self):
        """
        (GeneralTree) -> bool
        Returns false always.
        """
        return False

    def getIsLeaf(self):
        """
        (GeneralTree) -> bool
        Returns true if this general tree is a leaf.
        """
        return self._degree == 0

    def getDegree(self):
        """
        (GeneralTree) -> int
        Returns the degree of this general tree node.
        """
        return self._degree

#{

    def getKey(self):
        """
        (GeneralTree) -> Object
        Returns the key in this general tree node.
        """
        return self._key

    def getSubtree(self, i):
        """
        (GeneralTree) -> Object
        Returns the specified subtree of this general tree node.
        """
        if i < 0 or i >= self._degree:
            raise IndexError
        ptr = self._list.head
        for j in xrange(i):
            ptr = ptr.next
        return ptr.datum

    def attachSubtree(self, t):
        """
        (GeneralTree, GeneralTree) -> None
        Attaches the given general tree as a subtree
        of this general tree node.
        """
        self._list.append(t)
        self._degree += 1

    def detachSubtree(self, t):
        """
        (GeneralTree, GeneralTree) -> GeneralTree
        Detaches and returns specified general tree
        from this general tree node.
        """
        self._list.extract(t)
        self._degree -= 1
        return t


#}>b

    def _compareTo(self, obj):
        """
        (GeneralTree, GeneralTree) -> int

        Compares this general tree with the given general tree.
        """
        assert isinstance(self, obj.__class__)
        raise NotImplementedError

    @staticmethod
    def main(*argv):
        "GeneralTree test program."
        print GeneralTree.main.__doc__
        gt = GeneralTree('A')
        gt.attachSubtree(GeneralTree('B'))
        gt.attachSubtree(GeneralTree('C'))
        gt.attachSubtree(GeneralTree('D'))
        gt.attachSubtree(GeneralTree('E'))
        Tree.test(gt)
        return 0
예제 #4
0
class QueueAsLinkedList(Queue):
    """
    Queue implemented using a linked list.
    """

    #}@head

    #{

    # ...
    #}@tail

    #{
    def __init__(self):
        """
        (QueueAsLinkedList) -> None
        Constructs a queue.
        """
        super(QueueAsLinkedList, self).__init__()
        self._list = LinkedList()

    def purge(self):
        """
        (QueueAsLinkedList) -> None
        Purges this queue.
        """
        self._list.purge()
        self._count = 0
#}>a

#{

    def getHead(self):
        """
        (QueueAsLinkedList) -> Object
        Returns the object at the head of this queue.
        """
        if self._count == 0:
            raise ContainerEmpty
        return self._list.first

    def enqueue(self, obj):
        """
        (QueueAsLinkedList, Object) -> None
        Enqueues the given object to the tail of this queue.
        """
        self._list.append(obj)
        self._count += 1

    def dequeue(self):
        """
        (QueueAsLinkedList) -> Object
        Dequeues the object at the head of this queue.
        """
        if self._count == 0:
            raise ContainerEmpty
        result = self._list.first
        self._list.extract(result)
        self._count -= 1
        return result


#}>b

    def accept(self, visitor):
        """
        (QueueAsLinkedList, Visitor) -> None
        Makes the given visitor visit all the objects in this queue.
        """
        assert isinstance(visitor, Visitor)
        ptr = self._list.head
        while ptr is not None:
            visitor.visit(ptr.datum)
            if visitor.isDone:
                return
            ptr = ptr.next

    class Iterator(Iterator):
        """
        Enumerates the elements of a QueueAsLinkedList.
        """
        def __init__(self, queue):
            """
            (QueueAsLinkedList.Iterator, QueueAsLinkedList) -> None
            Constructs an iterator for the given queue.
            """
            super(QueueAsLinkedList.Iterator).__init__(queue)
            self._position = None

        def next(self):
            """
            (QueueAsLinkedList.Iterator) -> Object
            Returns the next element.
            """
            if self._position is None:
                self._position = self._container._list.head
            else:
                self._position = self._position.next
            if self._position is None:
                raise StopIteration
            return self._position.datum

    def __iter__(self):
        """
        (QueueAsLinkedList) -> QueueAsLinkedList.Iterator
        Returns an iterator for this queue.
        """
        return self.Iterator(self)

    def _compareTo(self, obj):
        """
        (QueueAsLinkedList, QueueAsLinkedList) -> int

        Comparse this queue with the given queue.
        """
        assert isinstance(self, obj.__class__)
        raise NotImplementedError

    @staticmethod
    def main(*argv):
        "QueueAsLinkedList test program."
        print QueueAsLinkedList.main.__doc__
        queue2 = QueueAsLinkedList()
        Queue.test(queue2)
        return 0
예제 #5
0
class QueueAsLinkedList(Queue):
    """
    Queue implemented using a linked list.
    """

#}@head

#{

    # ...
#}@tail


#{
    def __init__(self):
        """
        (QueueAsLinkedList) -> None
        Constructs a queue.
        """
        super(QueueAsLinkedList, self).__init__()
        self._list = LinkedList()

    def purge(self):
        """
        (QueueAsLinkedList) -> None
        Purges this queue.
        """
        self._list.purge()
        self._count = 0
#}>a

#{
    def getHead(self):
        """
        (QueueAsLinkedList) -> Object
        Returns the object at the head of this queue.
        """
        if self._count == 0:
            raise ContainerEmpty
        return self._list.first

    def enqueue(self, obj):
        """
        (QueueAsLinkedList, Object) -> None
        Enqueues the given object to the tail of this queue.
        """
        self._list.append(obj)
        self._count += 1

    def dequeue(self):
        """
        (QueueAsLinkedList) -> Object
        Dequeues the object at the head of this queue.
        """
        if self._count == 0:
            raise ContainerEmpty
        result = self._list.first
        self._list.extract(result)
        self._count -= 1
        return result
#}>b

    def accept(self, visitor):
        """
        (QueueAsLinkedList, Visitor) -> None
        Makes the given visitor visit all the objects in this queue.
        """
        assert isinstance(visitor, Visitor)
        ptr = self._list.head
        while ptr is not None:
            visitor.visit(ptr.datum)
            if visitor.isDone:
                return
            ptr = ptr.next

    class Iterator(Iterator):
        """
        Enumerates the elements of a QueueAsLinkedList.
        """

        def __init__(self, queue):
            """
            (QueueAsLinkedList.Iterator, QueueAsLinkedList) -> None
            Constructs an iterator for the given queue.
            """
            super(QueueAsLinkedList.Iterator).__init__(queue)
            self._position = None

        def next(self):
            """
            (QueueAsLinkedList.Iterator) -> Object
            Returns the next element.
            """
            if self._position is None:
                self._position = self._container._list.head
            else:
                self._position = self._position.next
            if self._position is None:
                raise StopIteration
            return self._position.datum

    def __iter__(self):
        """
        (QueueAsLinkedList) -> QueueAsLinkedList.Iterator
        Returns an iterator for this queue.
        """
        return self.Iterator(self)

    def _compareTo(self, obj):
        """
        (QueueAsLinkedList, QueueAsLinkedList) -> int

        Comparse this queue with the given queue.
        """
        assert isinstance(self, obj.__class__)
        raise NotImplementedError

    def main(*argv):
        "QueueAsLinkedList test program."
        print QueueAsLinkedList.main.__doc__
        queue2 = QueueAsLinkedList()
        Queue.test(queue2)
        return 0
    main = staticmethod(main)
예제 #6
0
class StackAsLinkedList(Stack):
    """
    Stack implemented using a linked list.
    """

#}@head

#{

    # ...
#}@tail

#{
    def __init__(self):
        """
        (StackAsLinkedList)
        Constructs a stack.
        """
        super(StackAsLinkedList, self).__init__()
        self._list = LinkedList()

    def purge(self):
        """
        (StackAsLinkedList) -> None
        Purges this stack.
        """
        self._list.purge()
        self._count = 0
#}>a

#{
    def push(self, obj):
        """
        (StackAsLinkedList, Object) -> None
        Pushes the given object on to this stack.
        """
        self._list.prepend(obj)
        self._count += 1

    def pop(self):
        """
        (StackAsLinkedList) -> None
        Pops the top object off this stack.
        """
        if self._count == 0:
            raise ContainerEmpty
        result = self._list.first
        self._list.extract(result)
        self._count -= 1
        return result

    def getTop(self):
        """
        (StackAsLinkedList) -> None
        Returns the object at the top of this stack.
        """
        if self._count == 0:
            raise ContainerEmpty
        return self._list.first
#}>b

#{
    def accept(self, visitor):
        """
        (StackAsLinkedList, Visitor) -> None
        Makes the given visitor visit all the objects in this stack.
        """
        assert isinstance(visitor, Visitor)
        ptr = self._list.head
        while ptr is not None:
            visitor.visit(ptr.datum)
            if visitor.isDone:
                return
            ptr = ptr.next
#}>c

#{
    class Iterator(Iterator):
        """
        Enumerates the elements of a StackAsLinkedList.
        """

        def __init__(self, stack):
            """
            (StackAsLinkedList.Iterator, StackAsLinkedList) -> None
            Constructs an iterator for the given stack.
            """
            super(StackAsLinkedList.Iterator, self).__init__(
		stack)
            self._position = stack._list.head

        def next(self):
            """
            (StackAsLinkedList.Iterator) -> Object
            Returns the next element.
            """
            if self._position is None:
		raise StopIteration
	    element = self._position
	    self._position = self._position.next
            return element.datum

    def __iter__(self):
        """
        (StackAsLinkedList) -> StackAsLinkedList.Iterator
        Returns an iterator for this stack.
        """
        return self.Iterator(self)
#}>d
    
    def _compareTo(self, obj):
        """
        (StackAsLinkedList, StackAsLinkedList) -> int

        Compares this stack with the given stack.
        """
        assert isinstance(self, obj.__class__)
        raise NotImplementedError

    @staticmethod
    def main(*argv):
        "StackAsLinkedList test program."
        print StackAsLinkedList.main.__doc__
        stack2 = StackAsLinkedList()
        Stack.test(stack2)
        return 0