Warning
This page is located in archive.

9. Abstraktní datový typ, zásobník, fronta

Zásobník

LIFO - Last In First Out

Obrázek převzat z https://commons.wikimedia.org/wiki/File:Lifo_stack.svg

class Zasobnik:
    def __init__(self,data=[]):
        self.data = data
 
    def push(self,item):
        self.data += [item]
 
    def pop(self):
        if self.data: # true pokud self.data != [], alternativa len(self.data)
            return self.data.pop(-1)
        else:  # pokud self.data == []
            return None
 
    def is_empty(self):  # zjisti, jestli je zasobnik prazdny
        return self.data == []  # alternativa return len(self.data)
 

s = Zasobnik()
 
N = 4
for i in range(N):
    print("zapisuji do zasobniku cislo: {}".format(i))
    s.push(i)  #
 
for i in range(N+1):
    print("vycitam ze zasobniku cislo: {}".format(s.pop()))

Úloha 1 - Dekódujte zprávu ze standardního vstupu pomocí zásobníku:

* Písmeno znamená *push* znaku (toho písmena) do zásobníku
* Hvězdička znamená *pop* znaku ze zásobníku na výstup
* Pokud je znak malé písmeno, před vložením do zásobníku jej převeďte na velké písmeno
* Jiné znaky se ignorují

  • Dekódujte vstup TE*A*QYS***SEU****ni*O**

zprava = 'TE*A*QYS***SEU****ni*O**'
 
s = Zasobnik()
 
# <vas kod>

Úloha 2 - Napište program, který s využitím zásobníku zkontroluje zda výraz obsahuje párové závorky ().

s = Zasobnik()
 
vyraz = 'asdfdasfdsa)()'
 
# <vas kod>

Úloha 3 - Převod čísla do zvolené číselné soustavy

Pomocí zásobníku realizujte funkci, která převede dekadické číslo do zvolené číselné soustavy

# <vas kod>

Úloha 4 - Napište program, který bude fungovat jako prefixový kalkulátor

  • Ze škol známá infixová notace je například: (4 - 1) x 5
  • V přednáškách máte příklad na postfixovou notaci
  • Prefixovou notací bychom stejný příklad zapsali jako: x - 4 1 5
  • Nejrpve se počítá 4 - 1 a výsledek se zapíše místo trojice znaků - 4 1, čímž dostaneme: x 3 5
  • Nakonec se spočítá 3 x 5 a výsledek je 15
  • K implementaci je možné využít zásobník a postupně procházet sekvenci argumentů od zadu
  • Pokud argument je číslo, vkládáme jej do zásobníku
  • Pokud argument je operátor, vyjmeme dvě naposled vložená čísla ze zásobníku a provedeme matematickou operaci, jejíž výsledek vložíme do zásobníku
  • Po projití všech argumentů zbyde v zásobníku výsledek

# <vas kod>

Fronta

FIFO - First In First Out

Obrázek převzat z https://cs.m.wikipedia.org/wiki/Soubor:Data_Queue.svg

class Fronta:
    def __init__(self,data=[]):
        self.data = data
 
    def enque(self,item):
        self.data += [item]
 
    def deque(self):
        if self.data: # true pokud self.data != [], alternativa len(self.data)
            return self.data.pop(0)
        else:  # pokud self.data == []
            return None
 
    def is_empty(self):  # zjisti, jestli je zasobnik prazdny
        return self.data == []  # alternativa return len(self.data)
 

s = Fronta()
 
N = 4
for i in range(N):
    print("zapisuji do fronty cislo: {}".format(i))
    s.enque(i)  #
 
for i in range(N+1):
    print("vycitam z fronty cislo: {}".format(s.deque()))

Úlohy ve zbytku cvičení nebo na doma

Úloha 5 - Rozšiřte program z úlohy 2 tak, aby fungoval také pro další párové závorky (),{},[]

 

courses/bab37zpr/tutorials/lab09.txt · Last modified: 2022/11/14 11:15 by vencovac