Zadanie
Jeden zásadný rozdiel
Počet bodov: 60
Pred pár týždňami sa dokončil v štátnej správe projekt za trinásťcifernú sumu (v mikrocentoch).
Bol to program, ktorý dostal na vstupe matematický výraz v tzv. postfixovej notácii a vyrátal jeho výsledok.
Postfixová notácia funguje tak, že namiesto toho, aby sme operátory
písali medzi operandami, píšeme ich za nimi. Napríklad
(x+y)*z
zapíšeme ako xy+z*
.
V takejto notácii sa výraz ľahko vyhodnocuje programom. Stačí začať s
prázdnym zásobníkom a čítať výraz zľava doprava. Keď prečítame operand,
pridáme ho na vrch zásobníka. Keď prečítame nejaký operátor
O
, zoberieme dve vrchné hodnoty zo zásobníka, aplikujeme na
ne operátor a výsledok vrátime do zásobníka. V pseudokóde by to teda
vyzeralo takto:
a = zasobnik.pop()
b = zasobnik.pop()
zasobnik.push(b O a)
Na konci procesu bude jediná hodnota v zásobníku výsledok celého
výrazu. Môžete si overiť, že tento postup vyráta z výrazu
xy+z*
hodnotu (x+y)*z
.
V implementácii programu v štátnej správe je však jeden zásadný rozdiel. Použili namiesto zásobníka (stack) frontu (queue). Tá sa od zásobníka líši tým, že zatiaľ čo pri zásobníku pridávame aj odoberáme prvky z vrchu, pri fronte pridávame prvky na vrch, ale odoberáme ich zospodu. To značne zmení, ako vyhodnotíme daný výraz.
Už je však neskoro, suma je vyplatená a program spustený. Ostáva jediné - napísať ďalší program, ktorý bude prepisovať výrazy z postfixovej notácie na takú, ktorú náš program vyhodnotí rovnako, ako by správny program so zásobníkom vyhodnotil originálnu.
Vstup a výstup
V prvom riadku vstupu je číslo \(T\) - počet výrazov, ktoré máme prepísať.
V každom z ďalších \(T\) riadkov je jeden výraz. Malé písmenká anglickej abecedy reprezentujú operandy, a veľké písmená reprezentujú operátory.
Vypíšte pre každý výraz \(A\) taký
výraz \(B\), že \(A\) sa vyhodnotí postupom popísaným v úlohe
so zásobníkom rovnako, ako sa vyhodnotí výraz \(B\), keď pri tom použijeme frontu. Aby bol
výstup jednoznačný, budeme predpokladať že žiadny z operátorov nie je
asociatívny ani komutatívny (aXb != bXa
,
(aXb)Xc != aX(bXc)
).
Platí \(1 \leq T \leq 100\).
Výrazy budú korektné výrazy v postfixovej notácii, ich dĺžka nepresiahne \(50\,000\) znakov a súčet ich dĺžok nepresiahne \(200\,000\) znakov.
V prvej sade platí, že dĺžka výrazu je najviac \(3\) znaky.
V druhej a tretej sade platí, že dĺžka výrazu je najviac \(100\) znakov.
V posledných troch sadách neplatia žiadne obmedzenia navyše.
Príklad
Input:
3
xyPzX
aaAaaAA
abcDEfGhiJK
Output:
yxzPX
aaaaAAA
cbDaihfEJGK
V prvom výraze napushujeme do fronty y,x,z. Vyberieme z nej y a x, a pushneme (xPy). Vyberieme z, (xPy) a pushneme ((xPy)Xz). To je výraz, ktorý by vyhodnotil správny program pre xyPzX.
Pre odovzdávanie sa musíš prihlásiť.