logo

Stable i Python

EN stable er en lineær datastruktur som lagrer elementer i en Sist inn/først ut (LIFO) eller First-In/Last-Out (FILO) måte. I stabel legges et nytt element til i den ene enden, og et element fjernes bare fra den enden. Sett inn og slett-operasjoner kalles ofte push og pop.

Stable i python



Funksjonene knyttet til stack er:

  • tømme() – Returnerer om stabelen er tom – Tidskompleksitet: O(1)
  • størrelse() – Returnerer størrelsen på stabelen – Tidskompleksitet: O(1)
  • topp() / kikk() – Returnerer en referanse til det øverste elementet i stabelen – Tidskompleksitet: O(1)
  • push(a) – Setter inn elementet ‘a’ på toppen av stabelen – Tidskompleksitet: O(1)
  • pop() – Sletter det øverste elementet i stabelen – Tidskompleksitet: O(1)

Gjennomføring:

Det er forskjellige måter en stack kan implementeres fra i Python. Denne artikkelen dekker implementeringen av en stabel ved hjelp av datastrukturer og moduler fra Python-biblioteket.
Stack i Python kan implementeres på følgende måter:

  • liste
  • Collections.deque
  • queue.LifoQueue

Implementering ved hjelp av liste:

Pythons innebygde datastrukturliste kan brukes som en stabel. I stedet for push(), brukes append() til å legge til elementer på toppen av stabelen mens pop() fjerner elementet i LIFO-rekkefølge.
Dessverre har listen noen mangler. Det største problemet er at det kan støte på hastighetsproblemer etter hvert som det vokser. Elementene i listen er lagret ved siden av hverandre i minnet, hvis stabelen vokser seg større enn minneblokken som for øyeblikket inneholder den, må Python gjøre noen minneallokeringer. Dette kan føre til at noen append()-kall tar mye lengre tid enn andre.



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>

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

Implementering ved hjelp av collections.deque:

Python-stack kan implementeres ved å bruke deque-klassen fra samlingsmodulen. Deque foretrekkes fremfor listen i tilfeller der vi trenger raskere append- og pop-operasjoner fra begge ender av beholderen, da deque gir en O(1)-tidskompleksitet for append- og pop-operasjoner sammenlignet med liste som gir O(n) tidskompleksitet.

De samme metodene på deque som vist i listen brukes, append() og 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>

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

Implementering ved bruk av kømodul

Kømodulen har også en LIFO-kø, som i utgangspunktet er en stabel. Data settes inn i køen ved å bruke put()-funksjonen og get() tar data ut fra køen.



Det er ulike funksjoner tilgjengelig i denne modulen:

  • maxsize – Antall varer tillatt i køen.
  • tømme() – Returner True hvis køen er tom, False ellers.
  • full() – Returner True hvis det er maxsize varer i køen. Hvis køen ble initialisert med maxsize=0 (standard), returnerer aldri full() True.
  • få() – Fjern og returner en vare fra køen. Hvis køen er tom, vent til en vare er tilgjengelig.
  • get_nowait() – Returner en vare hvis en er umiddelbart tilgjengelig, ellers hev QueueEmpty.
  • put(item) – Sett en vare i køen. Hvis køen er full, vent til en ledig plass er tilgjengelig før du legger til varen.
  • put_nowait(item) – Sett en vare i køen uten å blokkere. Hvis ingen gratis spilleautomat er tilgjengelig umiddelbart, hev QueueFull.
  • qsize() – Returner antall varer i køen.
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())>

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

Implementering ved hjelp av en enkeltlenket liste:

Den koblede listen har to metoder addHead(item) og removeHead() som kjører konstant. Disse to metodene er egnet for å implementere en stabel.

  • getSize() – Få antall elementer i stabelen.
  • er tom() – Returner True hvis stabelen er tom, False ellers.
  • kikke() – Returner det øverste elementet i stabelen. Hvis stabelen er tom, hev et unntak.
  • push(verdi) – Skyv en verdi inn i toppen av stabelen.
  • pop() – Fjern og returner en verdi i toppen av stabelen. Hvis stabelen er tom, hev et unntak.

Nedenfor er implementeringen av tilnærmingen ovenfor:

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] # Få gjeldende størrelse på stabelen def getSize(self): return self.size # Sjekk om stabelen er tom def isEmpty(self): return self.size = = 0 # Få det øverste elementet i stabelen def peek(self): # Sanitærsjekk for å se om vi # titter på en tom stabel. if self.isEmpty(): return Ingen returner self.head.next.value # Skyv en verdi inn i stabelen. def push(selv, verdi): node = Node(verdi) node.next = self.head.next # Få den nye noden til å peke på det gjeldende hodet self.head.next = node #!!! # Oppdater hodet til å være den nye noden self.size += 1 # Fjern en verdi fra stabelen og returner. def pop(selv): if self.isEmpty(): raise Unntak('Popping fra en tom stabel') remove = self.head.next self.head.next = remove.next #!!! endret self.size -= 1 returner remove.value # Driverkode hvis __navn__ == '__main__': stack = Stack() for i i området(1, 11): stack.push(i) print(f' Stabel: {stack}') for _ i området(1, 6): top_value = stack.pop() print(f'Pop: {top_value}') # variabelnavn endret print(f'Stack: { stack}')>

Produksjon

Stack: 10->9->8->7->6->5->4->3->2->1 Pop: 10 Pop: 9 Pop: 8 Pop: 7 Pop: 6 Stabel: 5->4->3->2->1>

Fordeler med Stack:

  • Stabler er enkle datastrukturer med et veldefinert sett med operasjoner, noe som gjør dem enkle å forstå og bruke.
  • Stabler er effektive for å legge til og fjerne elementer, da disse operasjonene har en tidskompleksitet på O(1).
  • For å reversere rekkefølgen på elementene bruker vi stabeldatastrukturen.
  • Stabler kan brukes til å implementere angre/redo-funksjoner i applikasjoner.

Ulemper med Stack:

  • Begrensning av størrelse i stabel er en ulempe, og hvis de er fulle, kan du ikke legge til flere elementer i stabelen.
  • Stabler gir ikke rask tilgang til andre elementer enn toppelementet.
  • Stabler støtter ikke effektivt søk, da du må poppe elementer ett etter ett til du finner elementet du leter etter.