2016-11-01 9 views
-1

2つの異なるファイルに2つのクラスがあります。私はArrayQueueクラスからadd_last(SinglyLinkedListClassから)を呼び出して、 'ArrayQueue'で終わるようにしようとしています。オブジェクトには属性 '_tail'がありません。前もって感謝します!あなたは親クラスののinit実行されなかったので、クラスオブジェクトには属性がありませんPython

#-------------------------------------------------------------------- 
class EmptyList (Exception) : 
    pass 
# ------------------------------------------------------------------- 

class SinglyLinkedList : 

    # ------------------------------------------------ # 
    class _Node :          # 
     def __init__ (self, theElement, theNext) : # 
      """Initializes newly created _Node"""  # 
      self._element = theElement     # 
      self._next = theNext     # 
    # ------------------------------------------------ # 


    def __init__ (self) : 
     """Initializes newly created SinglyLinkedList""" 
     self._head = None 
     self._tail = None 
     self._size = 0 
     self._lastNode = None 

    def __len__ (self) : 
     return self._size 

    def __str__ (self) : 
     """Returns string representation of SinglyLinkedList""" 
     returnString = 'Head --> ' 
     current = self._head 
     while current != None : 
      returnString += (str(current._element) + ' ') 
      current = current._next 
     returnString += ('<-- Tail (' 
      + ('Empty' if self._size == 0 else 'Not Empty') 
      + (' with ' + str(self._size) + ' elements)')) 
     return returnString 

    def __len__ (self) : 
     """Returns length of SinglyLinkedList""" 
     return self._size 

    def is_empty (self) : 
     """Returns True if SinglyLinkedList is empty""" 
     return self._size == 0 

    def first (self) : 
     """Returns element at head of SinglyLinkedList""" 
     if self._size == 0 : 
      raise EmptyList 
     return self._head._element 

    def last (self) : 
     """Returns element at tail of SinglyLinkedList""" 
     return self._tail._element 

    def add_first (self, newElement) : 
     """Inserts one element at head of SinglyLinkedL""" 
     theNewNode = self._Node (newElement, self._head) 
     self._head = theNewNode 
     if self._tail is None : 
      self._tail = theNewNode 
     self._size += 1 

    def delete_first (self) : #deque 
     """Deletes one element from head of SinglyLinkedList""" 
     if self._head is None : 
      raise EmptyList('Error: attempt delete_first on empty list!') 
     deletedElement = self._head._element 
     self._head = self._head._next 
     if self._head is None : 
      self._tail = None 
     self._size -= 1 
     return deletedElement 

    def add_last (self, newElement) : #enque 
     """Inserts one element at tail of SinglyLinkedList""" 
     theNewNode = self._Node (newElement, None) 
     if self.is_empty() : 
      self._head = theNewNode 
      self._tail = theNewNode 
     else: 
      self._tail._next = theNewNode 
      self._tail = theNewNode 
     self._size += 1 
# ------------------------------------------------------------------- 
class ArrayQueue (SinglyLinkedList): 


    def __str__ (self) : 
     returnString = 'Size is ' + str(self._size) + ' Front - > ' 
     for i in range (self._front, self._front + self._size) : 
      j = i % len(self._data) 
      returnString += (str(self._data[j]) + ' ') 
     return (returnString + ' <- Back') 


    def __len__ (self) : 
     return self._size 

    def __init__ (self) : 
     self._data = SinglyLinkedList() 
     self._size = 0 
     self._front = 0 

    def enqueue (self, e) : 
     self._size += 1 
     return SinglyLinkedList.add_last(self, e) 

    def dequeue (self) : 
     if self.is_empty() : 
      raise Empty('Queue is empty!') 
     self._size -= 1 
     return SinglyLinkedList.delete_first() 

    def first (self) : 
     if self.is_empty() : 
      raise Empty('Queue is empty!') 
     return SinglyLinkedList.first() 

    def is_empty (self) : 
     return self._size == 0 

if __name__ == '__main__' : 
    mylist = ArrayQueue() 
    choice = 0 
    element = None 
    while choice < 4 : 
     print ('1. enque') 
     print ('2. dequeue') 
     print ('3. first') 
     print ('4. is_empty') 
     choice = int(input('Enter Choice : ')) 
     if choice == 1 : 
      element = int(input('Enter integer to add : ')) 
      mylist.enqueue(element) 
     elif choice == 2 : 
      try : 
       print ('Deleted', mylist.dequeue()) 
      except Empty as el : 
       print (el) 

     elif choice == 3 : 
      print(mylist.first()) 

     elif choice == 4 : 
      mylist._size == 0 

     print(mylist) 
+0

なぜ '_tail'ですか?なぜ '_'?とても不必要だと思われる – MooingRawr

+0

なぜ最初にリンクされたリストを実装しようとしているのですか? –

+0

singlylinkedlistクラスには、ノードと呼ばれるクラスがあります。 _tailはリンクされたリストの終わりを参照しています。その学校のプロジェクトでは、キューで指定されたファイルから数学演算を読み込んで実行するために、単一リンクリストの形式でキューを使用します。私は、なぜarray_uequeのための単一リンクリストのadd_lastメソッドを私のエンキューメソッドに継承できないのか分かりません。 –

答えて

0

ArrayQueueには尾を持っていません。

class ArrayQueue (SinglyLinkedList): 

def __init__ (self) : 
    super(ArrayQueue , self).__init__() # call parent's init 
    self._size = 0 
    self._front = 0 
+0

ありがとうございました! –

0

ArrayQueue独自01​​方法を定義するので、SinglyLinkedListから継承__init__()_tailが定義されている)と呼ばれることはありません。

+0

お返事ありがとうございます! –

関連する問題