logo

Stack v Pythonu

A kup je linearna podatkovna struktura, ki shranjuje elemente v a Zadnji vstop/prvi ven (LIFO) ali način First In/Last Out (FILO). V skladu je nov element dodan na enem koncu in element je odstranjen samo s tega konca. Operaciji vstavljanja in brisanja se pogosto imenujeta push in pop.

Stack v pythonu



Funkcije, povezane s skladom, so:

  • prazno() – Vrne, ali je sklad prazen – Časovna kompleksnost: O(1)
  • velikost () – Vrne velikost sklada – Časovna kompleksnost: O(1)
  • top() / peek() – Vrne sklic na najvišji element sklada – Časovna kompleksnost: O(1)
  • potisni(a) – Vstavi element ‘a’ na vrh sklada – Časovna kompleksnost: O(1)
  • pop() – Izbriše najvišji element sklada – Časovna kompleksnost: O(1)

Izvedba:

V Pythonu je sklad mogoče implementirati na različne načine. Ta članek pokriva implementacijo sklada z uporabo podatkovnih struktur in modulov iz knjižnice Python.
Stack v Pythonu je mogoče implementirati na naslednje načine:

  • seznam
  • Zbirke.deque
  • čakalna vrsta.LifoQueue

Izvedba z uporabo seznama:

Pythonov vgrajen seznam struktur podatkov se lahko uporablja kot sklad. Namesto push() se append() uporablja za dodajanje elementov na vrh sklada, medtem ko pop() odstrani element v vrstnem redu LIFO.
Na žalost ima seznam nekaj pomanjkljivosti. Največja težava je, da lahko med rastjo naleti na težave s hitrostjo. Elementi na seznamu so shranjeni drug poleg drugega v pomnilniku; če sklad postane večji od bloka pomnilnika, ki ga trenutno vsebuje, potem mora Python narediti nekaj dodelitev pomnilnika. To lahko povzroči, da nekateri klici append() trajajo veliko dlje kot drugi.



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>

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

Izvedba z uporabo collections.deque:

Sklad Python je mogoče implementirati z uporabo razreda deque iz modula zbirk. Deque ima prednost pred seznamom v primerih, ko potrebujemo hitrejše operacije dodajanja in izpiranja z obeh koncev vsebnika, saj deque zagotavlja časovno kompleksnost O(1) za operacije dodajanja in izpiranja v primerjavi s seznamom, ki zagotavlja O(n) časovna kompleksnost.

Uporabljeni sta enaki metodi na deque, kot je prikazano na seznamu, append() in 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>

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

Izvedba z modulom čakalne vrste

Modul Queue ima tudi čakalno vrsto LIFO, ki je v bistvu sklad. Podatki se vstavijo v čakalno vrsto s funkcijo put(), get() pa vzame podatke iz čakalne vrste.



V tem modulu so na voljo različne funkcije:

  • maxsize – Število elementov, dovoljenih v čakalni vrsti.
  • prazno() – Vrni True, če je čakalna vrsta prazna, v nasprotnem primeru False.
  • poln() – Vrni True, če obstajajo maxsize elementov v čakalni vrsti. Če je bila čakalna vrsta inicializirana z maxsize=0 (privzeto), potem full() nikoli ne vrne True.
  • dobiti () – Odstranite in vrnite element iz čakalne vrste. Če je čakalna vrsta prazna, počakajte, da je element na voljo.
  • get_nowait() – Vrni element, če je takoj na voljo, sicer dvigni QueueEmpty.
  • postaviti (predmet) – Postavite predmet v čakalno vrsto. Če je čakalna vrsta polna, počakajte, da bo na voljo prosto mesto, preden dodate element.
  • put_nowait(element) – Postavite element v čakalno vrsto brez blokiranja. Če ni takoj na voljo nobene proste reže, dvignite QueueFull.
  • qsize() – Vrni število elementov v čakalni vrsti.
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())>

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

Izvedba z enojno povezanim seznamom:

Povezani seznam ima dve metodi addHead(item) in removeHead(), ki se izvajata v konstantnem času. Ti dve metodi sta primerni za izvedbo sklada.

  • getSize() – Pridobite število elementov v kupu.
  • je prazno() – Vrni True, če je sklad prazen, drugače pa False.
  • pokukati() – Vrnite zgornji element v kupu. Če je sklad prazen, dvignite izjemo.
  • potisni (vrednost) – Potisnite vrednost v glavo sklada.
  • pop() – Odstranite in vrnite vrednost v glavi sklada. Če je sklad prazen, dvignite izjemo.

Spodaj je izvedba zgornjega pristopa:

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] # Pridobi trenutno velikost sklada def getSize(self): return self.size # Preveri, če je sklad prazen def isEmpty(self): return self.size = = 0 # Pridobite zgornji element sklada def peek(self): # Sanitarni pregled, da vidimo, ali # kukamo v prazen sklad. if self.isEmpty(): return None return self.head.next.value # Potisnite vrednost v sklad. def push(self, value): vozlišče = vozlišče(vrednost) node.next = self.head.next # Naj bo novo vozlišče kazalo na trenutno glavo self.head.next = vozlišče #!!! # Posodobite glavo, da bo novo vozlišče self.size += 1 # Odstranite vrednost iz sklada in se vrnite. def pop(self): if self.isEmpty(): raise Exception('Izstrelitev iz praznega sklada') remove = self.head.next self.head.next = remove.next #!!! spremenjena self.size -= 1 return remove.value # Koda gonilnika if __name__ == '__main__': stack = Stack() for i in range(1, 11): stack.push(i) print(f' Stack: {stack}') for _ in range(1, 6): top_value = stack.pop() print(f'Pop: {top_value}') # spremenjeno ime spremenljivke print(f'Stack: { sklad}')>

Izhod

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

Prednosti Stacka:

  • Skladi so preproste podatkovne strukture z natančno definiranim naborom operacij, zaradi česar jih je enostavno razumeti in uporabljati.
  • Skladi so učinkoviti za dodajanje in odstranjevanje elementov, saj imajo te operacije časovno zahtevnost O(1).
  • Da obrnemo vrstni red elementov, uporabimo podatkovno strukturo sklada.
  • Skladi se lahko uporabljajo za izvajanje funkcij razveljavitve/ponovitve v aplikacijah.

Slabosti Stacka:

  • Omejitev velikosti v Stacku je pomanjkljivost in če so polni, v sklad ne morete dodati več elementov.
  • Skladi ne omogočajo hitrega dostopa do elementov, razen do zgornjega elementa.
  • Skladi ne podpirajo učinkovitega iskanja, saj morate elemente izpostavljati enega za drugim, dokler ne najdete elementa, ki ga iščete.