logo

Apilar en Python

A pila és una estructura de dades lineal que emmagatzema elements en a Darrer en entrar/primer en sortir (LIFO) o manera First In/Last-Out (FILO). A la pila, s'afegeix un element nou en un extrem i només s'elimina un element d'aquest extrem. Les operacions d'inserció i supressió sovint s'anomenen push i pop.

Apilar en python



Les funcions associades a la pila són:

  • buit() – Retorna si la pila està buida – Complexitat temporal: O(1)
  • mida () – Retorna la mida de la pila – Complexitat temporal: O(1)
  • amunt () / cop d'ull () – Retorna una referència a l'element superior de la pila – Complexitat temporal: O(1)
  • empènyer (a) – Insereix l'element ‘a’ a la part superior de la pila – Complexitat temporal: O(1)
  • pop() – Elimina l'element superior de la pila – Complexitat temporal: O(1)

Implementació:

Hi ha diverses maneres d'implementar una pila a Python. Aquest article tracta la implementació d'una pila utilitzant estructures de dades i mòduls de la biblioteca Python.
La pila a Python es pot implementar de les maneres següents:

  • llista
  • Col·leccions.deque
  • queue.LifoQueue

Implementació mitjançant llista:

La llista d'estructura de dades integrada de Python es pot utilitzar com a pila. En lloc de push(), append() s'utilitza per afegir elements a la part superior de la pila mentre que pop() elimina l'element en ordre LIFO.
Malauradament, la llista té algunes mancances. El problema més gran és que pot tenir problemes de velocitat a mesura que creix. Els elements de la llista s'emmagatzemen un al costat de l'altre a la memòria, si la pila creix més que el bloc de memòria que la conté actualment, llavors Python ha de fer algunes assignacions de memòria. Això pot provocar que algunes trucades a append() triguin molt més que altres.



Python
# Python program to # demonstrate stack implementation # using list stack = [] # append() function to push # element in the stack stack.append('a') stack.append('b') stack.append('c') print('Initial stack') print(stack) # pop() function to pop # element from stack in # LIFO order print('
Elements popped from stack:') print(stack.pop()) print(stack.pop()) print(stack.pop()) print('
Stack after elements are popped:') print(stack) # uncommenting print(stack.pop()) # will cause an IndexError # as the stack is now empty>

Sortida
Initial stack ['a', 'b', 'c'] Elements popped from stack: c b a Stack after elements are popped: []>

Implementació mitjançant collections.deque:

La pila de Python es pot implementar mitjançant la classe deque del mòdul de col·leccions. Deque es prefereix a la llista en els casos en què necessitem operacions d'afegir i pop més ràpides des dels dos extrems del contenidor, ja que deque proporciona una complexitat de temps O(1) per a les operacions d'afegir i pop en comparació amb la llista que proporciona O (n) complexitat temporal.

S'utilitzen els mateixos mètodes de deque que es veuen a la llista, append() i pop().

Python
# Python program to # demonstrate stack implementation # using collections.deque from collections import deque stack = deque() # append() function to push # element in the stack stack.append('a') stack.append('b') stack.append('c') print('Initial stack:') print(stack) # pop() function to pop # element from stack in # LIFO order print('
Elements popped from stack:') print(stack.pop()) print(stack.pop()) print(stack.pop()) print('
Stack after elements are popped:') print(stack) # uncommenting print(stack.pop()) # will cause an IndexError # as the stack is now empty>

Sortida
Initial stack: deque(['a', 'b', 'c']) Elements popped from stack: c b a Stack after elements are popped: deque([])>

Implementació mitjançant mòdul de cua

El mòdul de cua també té una cua LIFO, que bàsicament és una pila. Les dades s'insereixen a la cua mitjançant la funció put() i get() treu les dades de la cua.



Hi ha diverses funcions disponibles en aquest mòdul:

  • mida màxima – Nombre d'elements permesos a la cua.
  • buit() – Retorna True si la cua està buida, False en cas contrari.
  • ple () – Retorna True si n'hi ha mida màxima elements de la cua. Si la cua s'ha inicialitzat amb maxsize=0 (per defecte), aleshores full() no retorna mai True.
  • aconseguir() – Eliminar i tornar un element de la cua. Si la cua està buida, espereu fins que hi hagi un element disponible.
  • get_nowait() – Retorna un element si n'hi ha un disponible immediatament, en cas contrari, puja QueueEmpty.
  • posar (element) – Posa un article a la cua. Si la cua està plena, espereu fins que hi hagi un espai lliure abans d'afegir l'element.
  • put_nowait(element) – Posa un article a la cua sense bloquejar. Si no hi ha cap ranura lliure disponible immediatament, augmenta QueueFull.
  • qsize() – Retorna el nombre d'elements de la cua.
Python
# Python program to # demonstrate stack implementation # using queue module from queue import LifoQueue # Initializing a stack stack = LifoQueue(maxsize=3) # qsize() show the number of elements # in the stack print(stack.qsize()) # put() function to push # element in the stack stack.put('a') stack.put('b') stack.put('c') print('Full: ', stack.full()) print('Size: ', stack.qsize()) # get() function to pop # element from stack in # LIFO order print('
Elements popped from the stack') print(stack.get()) print(stack.get()) print(stack.get()) print('
Empty: ', stack.empty())>

Sortida
0 Full: True Size: 3 Elements popped from the stack c b a Empty: True>

Implementació mitjançant una llista enllaçada individualment:

La llista enllaçada té dos mètodes addHead(item) i removeHead() que s'executen en temps constant. Aquests dos mètodes són adequats per implementar una pila.

  • getSize() – Obteniu el nombre d'elements de la pila.
  • està buit() – Retorna True si la pila està buida, False en cas contrari.
  • ullada() – Retorna l'element superior de la pila. Si la pila està buida, planteja una excepció.
  • push(valor) – Introduïu un valor al capçal de la pila.
  • pop() – Eliminar i retornar un valor al capçal de la pila. Si la pila està buida, planteja una excepció.

A continuació es mostra la implementació de l'enfocament anterior:

Python
# Python program to demonstrate # stack implementation using a linked list. # node class class Node: def __init__(self, value): self.value = value self.next = None class Stack: # Initializing a stack. # Use a dummy node, which is # easier for handling edge cases. def __init__(self): self.head = Node('head') self.size = 0 # String representation of the stack def __str__(self): cur = self.head.next out = '' while cur: out += str(cur.value) + '->' cur = cur.next return out[:-2] # Obteniu la mida actual de la pila def getSize(self): return self.size # Comproveu si la pila està buida def isEmpty(self): return self.size = = 0 # Obteniu l'element superior de la pila def peek(self): # Comprovació sanitària per veure si # estem mirant una pila buida. if self.isEmpty(): retorna Cap retorn self.head.next.value # Introdueix un valor a la pila. def push(self, value): node = Node (valor) node.next = self.head.next # Feu que el nou node apunti al cap actual self.head.next = node #!!! # Actualitza el cap per ser el nou node self.size += 1 # Elimina un valor de la pila i torna. def pop(self): if self.isEmpty(): genera l'excepció ('Sortant d'una pila buida') remove = self.head.next self.head.next = remove.next #!!! s'ha canviat self.size -= 1 retorna remove.value # Codi del controlador if __name__ == '__main__': stack = Stack() for i in range(1, 11): stack.push(i) print(f' Pila: {pila}') per a _ dins l'interval (1, 6): valor_superior = stack.pop() print(f'Pop: {valor_superior}') # el nom de la variable ha canviat print(f'Pila: { pila}')>>> 

Sortida

Les piles són estructures de dades simples amb un conjunt d'operacions ben definit, que les fa fàcils d'entendre i utilitzar.
  • Les piles són eficients per afegir i eliminar elements, ja que aquestes operacions tenen una complexitat temporal de O(1).
  • Per invertir l'ordre dels elements utilitzem l'estructura de dades de la pila.
  • Les piles es poden utilitzar per implementar funcions de desfer/refer a les aplicacions.
  • Inconvenients de Stack:

    • La restricció de mida a la pila és un inconvenient i si estan plenes, no podeu afegir més elements a la pila.
    • Les piles no proporcionen accés ràpid a elements que no siguin l'element superior.
    • Les piles no admeten cerques eficients, ja que heu d'explotar els elements un per un fins que trobeu l'element que busqueu.