logo

Stapla i Python

A stack är en linjär datastruktur som lagrar objekt i en Sist in/först ut (LIFO) eller First-In/Last-Out (FILO) sätt. I stack läggs ett nytt element till i ena änden och ett element tas endast bort från den änden. Insert och delete-operationerna kallas ofta push och pop.

Stapla i python

Funktionerna associerade med stack är:



  • tömma() – Returnerar om stacken är tom – Tidskomplexitet: O(1)
  • storlek() – Returnerar stackens storlek – Tidskomplexitet: O(1)
  • top() / peek() – Returnerar en referens till det översta elementet i stacken – Tidskomplexitet: O(1)
  • push(a) – Infogar elementet 'a' överst i stacken – Tidskomplexitet: O(1)
  • pop() – Tar bort det översta elementet i stacken – Tidskomplexitet: O(1)

Genomförande:

Det finns olika sätt från vilka en stack kan implementeras i Python. Den här artikeln täcker implementeringen av en stack med hjälp av datastrukturer och moduler från Python-biblioteket.
Stack i Python kan implementeras på följande sätt:

  • lista
  • Collections.deque
  • queue.LifoQueue

Implementering med hjälp av lista:

Pythons inbyggda datastrukturlista kan användas som en stack. Istället för push(), används append() för att lägga till element till toppen av stacken medan pop() tar bort elementet i LIFO-ordning.
Tyvärr har listan några brister. Det största problemet är att det kan stöta på hastighetsproblem när det växer. Objekten i listan lagras bredvid varandra i minnet, om stacken växer sig större än minnesblocket som för närvarande innehåller det, måste Python göra några minnesallokeringar. Detta kan leda till att vissa append()-anrop tar mycket längre tid än andra.

Pytonorm
# 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>

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

Implementering med collections.deque:

Python-stack kan implementeras med hjälp av deque-klassen från samlingsmodulen. Deque föredras framför listan i de fall där vi behöver snabbare append- och pop-operationer från båda ändarna av behållaren, eftersom deque ger en O(1)-tidskomplexitet för append- och pop-operationer jämfört med list som ger O(n) tidskomplexitet.

Samma metoder på deque som visas i listan används, append() och pop().

Pytonorm
# 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>

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

Implementering med hjälp av kömodul

Kömodulen har också en LIFO-kö, som i grunden är en stack. Data infogas i Queue med put()-funktionen och get() tar ut data från Queue.

Det finns olika funktioner tillgängliga i denna modul:

  • maxstorlek – Antal artiklar tillåtna i kön.
  • tömma() – Returnera True om kön är tom, False annars.
  • full() – Returnera True om det finns maxstorlek föremål i kön. Om kön initierades med maxsize=0 (standard), returnerar full() aldrig True.
  • skaffa sig() – Ta bort och returnera en vara från kön. Om kön är tom, vänta tills ett objekt är tillgängligt.
  • get_nuwait() – Returnera en vara om en är tillgänglig omedelbart, annars höj QueueEmpty.
  • put(item) – Lägg en vara i kön. Om kön är full, vänta tills en ledig plats finns tillgänglig innan du lägger till föremålet.
  • put_nuwait(artikel) – Lägg en vara i kön utan att blockera. Om ingen ledig slot är tillgänglig direkt, höj QueueFull.
  • qsize() – Returnera antalet artiklar i kön.
Pytonorm
# 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())>

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

Implementering med en enskild länkad lista:

Den länkade listan har två metoder addHead(item) och removeHead() som körs konstant. Dessa två metoder är lämpliga för att implementera en stack.

  • getSize() – Få antalet föremål i högen.
  • är tom() – Returnera True om stacken är tom, annars False.
  • titt() – Lämna tillbaka det översta föremålet i högen. Om stacken är tom, höj ett undantag.
  • push(värde) – Tryck in ett värde i högens huvud.
  • pop() – Ta bort och returnera ett värde i toppen av stacken. Om stacken är tom, höj ett undantag.

Nedan är implementeringen av ovanstående tillvägagångssätt:

Pytonorm
# 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] # Hämta den aktuella storleken på stacken def getSize(self): return self.size # Kontrollera om stacken är tom def isEmpty(self): return self.size = = 0 # Få det översta objektet i stacken def peek(self): # Sanitetskontroll för att se om vi # tittar på en tom stack. if self.isEmpty(): return None return self.head.next.value # Tryck in ett värde i stacken. def push(self, value): node = Node(värde) node.next = self.head.next # Få den nya noden att peka på det aktuella huvudet self.head.next = nod #!!! # Uppdatera huvudet till den nya noden self.size += 1 # Ta bort ett värde från stacken och returnera. def pop(self): if self.isEmpty(): höj Undantag('Poppar från en tom stack') remove = self.head.next self.head.next = remove.next #!!! ändrad self.size -= 1 returnera remove.value # Driver Code if __name__ == '__main__': stack = Stack() för i i intervallet(1, 11): stack.push(i) print(f' Stack: {stack}') för _ i intervallet(1, 6): top_value = stack.pop() print(f'Pop: {top_value}') # variabelnamn ändrat print(f'Stack: { stack}')>

Produktion

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

Fördelar med Stack:

  • Stackar är enkla datastrukturer med en väldefinierad uppsättning operationer, vilket gör dem lätta att förstå och använda.
  • Stackar är effektiva för att lägga till och ta bort element, eftersom dessa operationer har en tidskomplexitet på O(1).
  • För att vända ordningen på element använder vi stackdatastrukturen.
  • Stackar kan användas för att implementera ångra/gör om funktioner i applikationer.

Nackdelar med Stack:

  • Storleksbegränsning i Stack är en nackdel och om de är fulla kan du inte lägga till fler element i stacken.
  • Staplar ger inte snabb åtkomst till andra element än det översta elementet.
  • Stackar stöder inte effektiv sökning, eftersom du måste poppa element ett efter ett tills du hittar det element du letar efter.