Hi,
I'm reading "How to think like a computer scientist in python". So far,
it's been smooth sailing, but the final exercise in chapter 19 really
has me stumped. Is it just me, or did this book get very difficult, very
quickly? It says:

"As an exercise, write an implementation of the Priority Queue ADT using a
linked list. You should keep the list sorted so that removal is a constant
time operation. Compare the performance of this implementation with the
Python list implementation."

Here is the code so far:

import sys

class Node:
        def __init__(self, cargo=None, next=None, prev=None):
                self.cargo = cargo
                self.next = next
                self.prev = prev

        def __str__(self):
                return str(self.cargo)

        def printBackward(self):
                if self.next != None:
                        tail = self.next
                        tail.printBackward()
                print self.cargo

class LinkedList:
        def __init__(self):
                self.length = 0
                self.head = None

        def printBackward(self):
                print "["
                if self.head != None:
                        self.head.printBackward()
                print "]"

        def addFirst(self, cargo):
                node = Node(cargo)
                node.next = self.head
                self.head = node
                self.length = self.length + 1

def printList(node):
        sys.stdout.write("[")
        while node:
                sys.stdout.write(str(node.cargo))
                if node.next != None:
                        sys.stdout.write(", ")
                else:
                        sys.stdout.write("]")
                node = node.next
        print

def printBackward(list):
        if list == None:
                return
        head = list
        tail = list.next
        printBackward(tail)
        print head,

def removeSecond(list):
        if list == None: return
        if list.next == None: return
        first = list
        second = list.next
        first.next = second.next
        second.next = None
        return second

def printBackwardNicely(list):
        print "[",
        if list != None:
                head = list
                tail = list.next
                printBackward(tail)
                print head,
        print "]"

class Queue:
        def __init__(self):
                self.length = 0
                self.head = None

        def isEmpty(self):
                return (self.length == 0)

        def insert(self, cargo):
                node = Node(cargo)
                node.next = None
                if self.head == None:
                        self.head = node
                else:
                        last = self.head
                        while last.next: last = last.next
                        last.next = node
                self.length = self.length + 1

        def remove(self):
                cargo = self.head.cargo
                self.head = self.head.next
                self.length = self.length - 1
                return cargo

class ImprovedQueue:
        def __init__(self):
                self.length = 0
                self.head = None
                self.last = None

        def isEmpty(self):
                return (self.length == 0)

        def insert(self, cargo):
                node = Node(cargo)
                node.next = None
                if self.length == 0:
                        self.head = self.last = node
                else:
                        last = self.last
                        last.next = node
                        self.last = node
                self.length = self.length + 1

        def remove(self):
                cargo = self.head.cargo
                self.head = self.head.next
                self.length = self.length - 1
                if self.length == 0:
                        self.last = None
                return cargo

class PriorityQueue:
        def __init__(self):
                self.items = []

        def isEmpty(self):
                return self.items == []

        def insert(self, item):
                self.items.append(item)

        def remove(self):
                maxi = 0
                for i in range(1,len(self.items)):
                        if self.items[i] > self.items[maxi]:
                                maxi = i
                item = self.items[maxi]
                self.items[maxi:maxi+1] = []
                return item

class Golfer:
        def __init__(self, name, score):
                self.name = name
                self.score = score

        def __str__(self):
                return "%-16s: %d" % (self.name, self.score)

        def __cmp__(self, other):
                if self.score < other.score: return 1
                if self.score > other.score: return -1
                return 0

I figured I'd copy ImprovedQueue and tamper with the insert method
so as to traverse the linked list, checking if the cargo of the next node
was smaller than the one I was inserting, and if so, to set the current
node's next to the new node, and the new node's next to the node with the
lesser value, but I just can't get this to work outside of my head. I'd
appreciate any pointers anyone might give me to figure this out.

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to