Stack assignment problems in Python

Asked

Viewed 148 times

0

I’m having a problem with a stack code, is returning the following message:

line 9 in empilhar_pilha: novo_numero.proximo = pilha.topo
AttributeError: 'float' object has no attribute 'proximo'
line 18, in desempilhar_pilha: pilha.topo = pilha.topo.proximo
AttributeError: 'NoneType' object has no attribute 'proximo'

Not to mention that the option 4 List stack does not appear anything.

class Pilha:
    topo = None

class Elemento:
    numero: float
    proximo = None

def empilhar_pilha(pilha, novo_numero):
    novo_numero.proximo = pilha.topo
    pilha.topo = novo_numero
    print(f"Elemento {novo_numero.numero} foi inserido no topo da pilha")

def desempilhar_pilha(pilha):
    if tamanho_pilha(pilha) == 0:
        print("A pilha está vazia")
    else:
        elemento_excluido = pilha.topo
        pilha.topo = pilha.topo.proximo
        exclusao_feita = elemento_excluido.numero
        del elemento_excluido
        print(f"Elemento ({exclusao_feita}) foi excluido do topo da pilha")

def tamanho_pilha(pilha):
    if (pilha_vazia(pilha) == True):
        return 0
    else:
        contador_pilha = 0
        numero_pilha = pilha.topo
        while numero_pilha != None:
            contador_pilha += 1
            numero_pilha = numero_pilha.proximo
        return contador_pilha

def pilha_vazia(pilha):
    situacao_pilha = (pilha.topo == None)
    return situacao_pilha

def listar_pilha(pilha):
    if pilha_vazia(pilha) == 0:
        print("A pilha esta vazia\n")
    else:
        ver_numero = pilha.topo
        while ver_numero != None:
            print(ver_numero.numero, end= "--> Topo\n" if ver_numero == pilha.topo else print())
            ver_numero = ver_numero.proximo

pilha_pilhosa = Pilha()
opcao = 1
while opcao != 5:
    print ("1 - Empilhar")
    print ("2 - Desempilhar")
    print ("3 - Informar tamanho da pilha")
    print ("4 - Listar pilha")
    print ("5 - Sair")
    opcao = int(input("Informe a opcao: "))
    if opcao == 1:
       numero_informado = float(input("Digite um número: "))
       empilhar_pilha(pilha_pilhosa, numero_informado)
    elif opcao == 2:
       desempilhar_pilha(pilha_pilhosa)
    elif opcao == 3:
       print(f"Tamanho da pilha é de {tamanho_pilha(pilha_pilhosa)} elementos\n")
    elif opcao == 4:
       listar_pilha(pilha_pilhosa)
    elif opcao == 5:
        print("Saindo...\n")
    else:
        print("Opcao invalida, digite uma opcao valida no menu\n")

1 answer

1


You are declaring class attributes Elemento statically, this causes each Elemento use the same memory space to store the attributes proximo and numero, making it impossible to create the dynamic structure of your stack.

The class Pilha is also declaring the class attribute topo statically, this makes it impossible for you to have more than one instance of Pilha.

Follow your code with some fixes in order to make it more compact and functional:

class Pilha:
    def __init__(self):
        self.topo = None

class Elemento:
    def __init__(self, n, p ):
        self.numero = n
        self.proximo = p

def empilhar_pilha(pilha, novo_numero):
    novo_elemento = Elemento( novo_numero, pilha.topo )
    pilha.topo = novo_elemento
    print("Elemento {} foi inserido no topo da pilha".format(novo_elemento.numero) )

def desempilhar_pilha(pilha):
    if pilha.topo == None:
        print("A pilha está vazia\n")
        return
    elemento_excluido = pilha.topo
    pilha.topo = pilha.topo.proximo
    exclusao_feita = elemento_excluido.numero
    del elemento_excluido
    print("Elemento ({}) foi excluido do topo da pilha".format(exclusao_feita) )

def tamanho_pilha(pilha):
    if (pilha.topo == None ):
        return 0
    contador_pilha = 0
    numero_pilha = pilha.topo
    while numero_pilha != None:
        contador_pilha += 1
        numero_pilha = numero_pilha.proximo
    return contador_pilha

def listar_pilha(pilha):
    if pilha.topo == None:
        print("A pilha esta vazia\n")
        return
    ver_numero = pilha.topo
    while ver_numero != None:
        print(ver_numero.numero);
        ver_numero = ver_numero.proximo


pilha_pilhosa = Pilha()

while True:

    print ("1 - Empilhar")
    print ("2 - Desempilhar")
    print ("3 - Informar tamanho da pilha")
    print ("4 - Listar pilha")
    print ("5 - Sair")

    opcao = int(input("Informe a opcao: "))

    if opcao == 1:
       numero_informado = float(input("Digite um número: "))
       empilhar_pilha(pilha_pilhosa, numero_informado)
    elif opcao == 2:
       desempilhar_pilha(pilha_pilhosa)
    elif opcao == 3:
       print("Tamanho da pilha eh de {} elementos\n".format(tamanho_pilha(pilha_pilhosa)))
    elif opcao == 4:
       listar_pilha(pilha_pilhosa)
    elif opcao == 5:
        print("Saindo...\n")
        break;
    else:
        print("Opcao invalida, digite uma opcao valida no menu\n")

You can turn all your functions into class members Pilha, look at you:

class Elemento:
    def __init__(self, n, p ):
        self.numero = n
        self.proximo = p

class Pilha:
    def __init__(self):
        self.topo = None

    def empilhar(self, novo_numero):
        novo_elemento = Elemento( novo_numero, self.topo )
        self.topo = novo_elemento
        print("Elemento {} foi inserido no topo da pilha".format(novo_elemento.numero) )

    def desempilhar(self):
        if self.topo == None:
            print("A pilha está vazia\n")
            return
        elemento_excluido = self.topo
        self.topo = self.topo.proximo
        exclusao_feita = elemento_excluido.numero
        del elemento_excluido
        print("Elemento ({}) foi excluido do topo da pilha".format(exclusao_feita) )

    def tamanho(self):
        if (self.topo == None ):
            return 0
        contador_pilha = 0
        numero_pilha = self.topo
        while numero_pilha != None:
            contador_pilha += 1
            numero_pilha = numero_pilha.proximo
        return contador_pilha

    def listar(self):
        if self.topo == None:
            print("A pilha esta vazia\n")
            return
        ver_numero = self.topo
        while ver_numero != None:
            print(ver_numero.numero);
            ver_numero = ver_numero.proximo


pilha_pilhosa = Pilha()

while True:

    print ("1 - Empilhar")
    print ("2 - Desempilhar")
    print ("3 - Informar tamanho da pilha")
    print ("4 - Listar pilha")
    print ("5 - Sair")

    opcao = int(input("Informe a opcao: "))

    if opcao == 1:
       numero_informado = float(input("Digite um número: "))
       pilha_pilhosa.empilhar(numero_informado)
    elif opcao == 2:
       pilha_pilhosa.desempilhar()
    elif opcao == 3:
       print("Tamanho da pilha eh de {} elementos\n".format(pilha_pilhosa.tamanho()))
    elif opcao == 4:
       pilha_pilhosa.listar()
    elif opcao == 5:
        print("Saindo...\n")
        break;
    else:
        print("Opcao invalida, digite uma opcao valida no menu\n")
  • This type of code is for queue?

  • class Elemento:
 def __init__(self, n, p ):
 self.numero = n
 self.proximo = p explain this part to me

  • It worked perfectly, thanks @Lacobus.

  • @Alexf.: Is a constructor: https://pt.wikipedia.org/wiki/Construtor#Python

  • Okay then, thanks again.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.