V programskem jeziku java napišite kalkulator, ki omogoča napredno računanje s celimi (int) števili in sicer:

  • računanje aritmetičnih izrazov v obratnem poljskem zapisu (angl. reverse polish notation)
  • preprosto konkatenacijsko programiranje (s pomočjo sklada)
  • preproste programske konstrukte (pogoje, enojne zanke - funkcije)
  • izpis vsebine sklada kot implicitnega d-tiškega drevesa. 

Kalkulator naj izraze bere s standardnega vhoda. Vsaka vrstica predstavlja en izraz. Med posameznimi simboli in številkami bo vedno vsaj en presledek. Predpostavite lahko, 

da bodo pri testiranju vsi vhodi sintaktično in semantično pravilni. Vsa števila so podana in naj bodo izpisana kot nizi. Rešitev implementirajte s pomočjo dveh skladov: glavnega (za računanje) in pomožnega (za hrambo funkcij).

Izračun izrazov v obratnem poljskem zapisu implementirajte s pomočjo glavnega sklada. Kalkulator naj podpira naslednje ukaze oz. operacije:

  • echo - v vrstici izpiše vrh sklada (odstrani element na vrhu) ; če je sklad prazen, izpiše prazno vrstico
  • stack - v vrstici izpiše celoten sklad od dna do vrha; če je sklad prazen, izpiše le prazno vrstico
  • clear - izprazne sklad
  • space - zapiše presledek 
  • pop - odstrani vrh sklada
  • dup - podvoji vrh sklada (x -> x x)
  • dup2 - podvoji par na vrhu sklada (x y -> x y x y)
  • swap - zamenja vrhnja dva elementa sklada (x y -> y x)
  • reverse - obrne vrstni red vseh elementov na skladu (u v x y z -> z y x v u)

Naslednje operacije zamenjajo vrh glavnega  sklada z ustreznim rezultatom (x -> y):

  • even - vrh sklada zamenja z 1, če je vrh sod, sicer z 0
  • odd - vrh sklada zamenja z 1, če je vrh lih, sicer z 0
  • ! - vrh sklada zamenja s faktorielo vrha
  • len - vrh sklada zamenja z dolžino elementa na vrhu

Naslednje operacija zamenjajo vrhnja dva elementa glavnega sklada z ustreznim rezultatom (x y -> r):

  • <> - primerja zgornja dva elementa (x y) sklada in na sklad porine 1 (če x <> y) ali 0 (če x == y)
  • < - primerja zgornja dva elementa sklada in na sklad porine 1 (če x < y) ali 0 (sicer)
  • <= - primerja zgornja dva elementa sklada in na sklad porine 1 (če x <= y) ali 0 (sicer)
  • == - primerja zgornja dva elementa sklada in na sklad porine 1 (če x == y) ali 0 (sicer)
  • > - primerja zgornja dva elementa sklada in na sklad porine 1 (če x > y) ali 0 (sicer)
  • >= - primerja zgornja dva elementa sklada in na sklad porine 1 (če x >= y) ali 0 (sicer)
  • + - vsota vrhnjih dveh elementov sklada
  • - - razlika vrhnjih dveh elementov sklada
  • * - zmnožek vrhnjih dveh elementov sklada
  • / - kvocient (celoštevilsko deljenje) vrhnjih dveh elementov sklada
  • % - ostanek po deljenju elementa pod vrhom z elementom na vrh
  • - stakne (združi, zlepi) vrhnja dva elementa sklada v en element (x y -> xy)

Naslednje operacije omogočajo izvedbo pogojnega stavka in enostavnih zank (ponavljanje funkcije, ki je zapisana v pomožnem skladu):