Стек связанного списка, использующий любой тип данных в Python - PullRequest
0 голосов
/ 19 марта 2019

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

Код:

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.Я хочу повторить это, но записи могут иметь любой тип данных (универсальный тип), а не только Node (узлы).Проблема, с которой я продолжаю сталкиваться, заключается в том, что объект int не имеет атрибута NEXT.

1 Ответ

0 голосов
/ 19 марта 2019

Хорошо, для начала я бы порекомендовал вам иметь конструктор для класса 'Node', например:

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

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

node.NEXT = self.__START

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

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

...