INTRODUCCIÓ:
En aquest exercici considerarem arbres que representen expressions sobre els operadors +,-,*, i sobre operands naturals. Per exemple, el següent arbre representa l’expressió 3+4*2-5.
-
|
---- ----
| |
+ 5
|
---- ----
| |
3 *
|
---- ----
| |
4 2
EXERCICI:
Implementeu una funció que, donat un arbre binari d’strings que representa una expressió correcta sobre naturals i operadors +,-,*, retorna la seva avaluació. Aquesta és la capcelera:
// Pre: t és un arbre no buit que representa una expressió correcta // sobre els naturals i els operadors +,-,*. // Les operacions no produeixen errors d'overflow. // Post: Retorna l'avaluació de l'expressió representada per t. int evaluate(BinTree<string> t);
Aquí tenim un exemple de paràmetre d’entrada de la funció i la corresponent sortida:
t= *
|
------- -------
| |
+ -
| |
---- ---- ---- ----
| | | |
1 2 5 3
=>
6
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar per a compilar: main.cc, BinTree.hh, evaluate.hh, utils.hh, utils.cc. Us falta crear el fitxer evaluate.cc amb els corresponents includes i implementar-hi la funció anterior. Valdrà la pena que utilitzeu algunes de les funcions oferides a utils.hpp. Només cal que pugeu evaluate.cc al jutge.
Entrada
La primera linia de l’entrada descriu el format en el que es descriuen els arbres, o bé INLINEFORMAT o bé VISUALFORMAT. Després venen un nombre arbitrari de casos. Cada cas consisteix en una descripció d’un arbre binari que representa una expressió. Fixeu-vos en que el programa que us oferim ja s’encarrega de llegir aquestes entrades. Només cal que implementeu la funció abans esmentada.
Sortida
Per a cada cas, la sortida conté la corresponent avaluació de l’arbre. Fixeu-vos en que el programa que us oferim ja s’encarrega d’escriure aquesta sortida. Només cal que implementeu la funció abans esmentada.
Observació
La vostra funció i subfuncions que creeu han de treballar només amb arbres. Heu de trobar una solució RECURSIVA del problema.
Input
VISUALFORMAT
-
|
-------- --------
| |
+ -
| |
------- ------- ---- ----
| | | |
+ - 5 1
| |
---- ---- ---- ----
| | | |
5 2 3 4
*
|
------- -------
| |
+ -
| |
---- ---- ---- ----
| | | |
4 4 7 3
-
|
------- -------
| |
- +
| |
---- ---- ---- ----
| | | |
+ 7 6 7
|
---- ----
| |
8 1
+
|
---- ----
| |
3 5
6
-
|
-------------------- --------------------
| |
* +
| |
--------------- --------------- ------- -------
| | | |
- - * *
| | | |
------- ------- ------- ------- ---- ---- ---- ----
| | | | | | | |
* * * * 7 4 3 *
| | | | |
---- ---- ---- ---- ---- ---- ---- ---- ---- ----
| | | | | | | | | |
8 7 3 5 5 1 8 5 2 7
-
|
---- ----
| |
2 2
-
|
--------------- ---------------
| |
- -
| |
---- ---- -------- --------
| | | |
- 3 + +
| | |
------- ------- ---- ---- ------- -------
| | | | | |
+ * * 1 + -
| | | | |
---- ---- ---- ---- ---- ---- ---- ---- ---- ----
| | | | | | | | | |
4 6 2 2 8 4 4 3 2 4
+
|
---- ----
| |
5 3
+
|
---------------- ----------------
| |
* -
| |
------------- ------------- ---- ----
| | | |
+ * - 3
| | |
------- ------- ---- ---- ---- ----
| | | | | |
- * - 5 4 4
| | |
---- ---- ---- ---- ---- ----
| | | | | |
1 1 4 8 4 2
Output
2 32 -11 8 6 -1505 0 -25 8 317
Input
INLINEFORMAT +(12,52) +(-(+(19,51),-(89,*(58,20))),30) *(18,43) -(*(+(-(-(93,87),+(88,89)),+(38,36)),46),*(+(15,58),72)) 69 -(*(92,31),*(37,86)) +(+(8,22),*(94,57)) -(*(16,24),7) -(81,39) +(-(-(+(43,20),*(78,98)),32),-(+(*(75,62),13),+(+(100,0),-(0,1)))) +(63,18) 44 -(-(+(+(97,*(97,39)),*(46,25)),-(+(+(38,31),+(21,84)),*(21,-(86,100)))),+(58,13)) -(-(-(*(-(67,51),7),+(-(10,57),*(60,9))),*(84,+(25,11))),+(-(34,-(10,*(39,87))),42)) +(-(-(+(100,32),60),*(80,+(14,94))),-(*(71,35),+(*(11,30),-(66,25)))) *(63,65) +(41,-(29,+(-(-(47,76),+(48,46)),*(-(83,20),13)))) +(+(10,4),74) -(-(+(*(39,75),-(22,*(31,65))),*(79,45)),-(*(9,97),+(+(5,-(40,36)),66))) -(-(*(15,98),*(80,84)),+(-(*(89,-(22,5)),-(-(81,28),*(92,26))),20))
Output
64 1171 774 -9718 69 -330 5388 377 42 -3049 81 44 4491 -6864 -6454 4095 -626 88 -3421 -9122