Связанный стек списков с использованием любого типа данных в Python

#python #types #linked-list #duck-typing

#python #типы #связанный список #ввод с уткой

Вопрос:

У меня есть следующий код, который позволяет мне нажимать (помещать известный тип в стек), всплывать (удалять последнее добавленное значение из стека) и выполнять итерации по стеку.

Код:

 class Node:
    def __init__(self):
        self.__value = 0
        self.__NEXT = None

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, x):
        self.__value = x

    @property
    def NEXT(self):
        return self.__NEXT

    @NEXT.setter
    def NEXT(self, x):
        if type(x) is Node:
            self.__NEXT = x
        else:
            raise TypeError("Invalid DataType provided for NEXT Pointer, needs to be of type Node")

    def __str__(self):
        return "{}".format(self.__value)



class Stack:

    def __init__ (self):
        self.__START = None
        self.__END = None

    @property
    def START(self):
        return self.__START

    @property
    def END(self):
        return self.__END

    def PUSH(self, node):
        print(node)
        if type(node) is not Node:
            raise TypeError("Invalid DataType provided for NEXT Pointer, needs to be of type Node")

        if self.__START is None:
            self.__START = node
            self.__END = node
            return

        node.NEXT = self.__START
        self.__START = node
        #setting the top of the stack as self.__START

    def POP(self):
        if self.__START == None:
            raise ValueError("There are no nodes in the Linked List")

        self.__START = self.__START.NEXT
        print("POP completed")
        #setting the second to the top as the top

    def __iter__(self): 
        self.__ITERATOR = self.__START 
        return self 

    def __next__(self): 
        if self.__ITERATOR != None: 
            node = self.__ITERATOR 
            self.__ITERATOR = self.__ITERATOR.NEXT 
            return node 
        else: 
            raise StopIteration



myStack = Stack()

node1 = Node()
node1.value = 1
node2 = Node()
node2.value = 2
node3 = Node()
node3.value = 3
node4 = Node()
node4.value = 4

myStack.PUSH(node1)
myStack.PUSH(node2)
myStack.POP()
myStack.PUSH(node3)
myStack.PUSH(node4)
myStack.POP()

for node in myStack:
    print(node)
  

Вывод таков:
1
2
POP завершен
3
4
POP завершен
3
1

Этот код работает, если записи имеют тип Node. Я хочу повторить это, но записи могут быть любого типа данных (общий тип), а не только узла (nodes). Проблема, с которой я продолжаю сталкиваться, заключается в том, что объект ‘int’ не имеет атрибута ‘NEXT’.

Ответ №1:

Ну, для начала я бы порекомендовал вам иметь конструктор для класса ‘Node’, подобный следующему:

 class Node:
    def __init__(self, value=0, next=None):
        self.__value = value
        self.__NEXT = next
  

Затем вы должны иметь в виду, что в классе ‘Stack’ вы используете интерфейс класса ‘Node’ с:

 node.NEXT = self.__START
  

Итак, все узлы, которые вы помещаете в стек, должны либо быть экземпляром класса ‘Node’, либо принадлежать классу, который наследуется от класса ‘Node’.

Что касается наследования, проверьте следующую документацию.

Комментарии:

1. Любой вариант шаблона или общий тип для решения его проблемы?