• Non ci sono risultati.

Valutazione di espressioni in notazione postfissa

N/A
N/A
Protected

Academic year: 2021

Condividi "Valutazione di espressioni in notazione postfissa"

Copied!
8
0
0

Testo completo

(1)

EXE su strutture dati elementari

INFORMATICA III

Parte B - Progettazione e Algoritmi

Patrizia Scandurra patrizia.scandurra@unibg.it

Università degli Studi di Bergamo a.a. 2011-12

(2)

Valutare le espressioni aritmetiche

• Consideriamo espressioni aritmetiche di somma e prodotto tra numeri naturali tra 0 e 9

• Quando si valuta un’espressione aritmetica

bisogna tener conto dell’ordine di precedenza e dell’associatività degli operatori

• Tre notazioni:

Infissa: (5 ( (9 + 8) + 7) ) Postfissa: 5 9 8 + 7 +

Prefissa: 5 + + 9 8 7

(3)

Valutazione di espressioni in notazione postfissa

• Consideriamo la forma POSTFISSA:

11 22+33* in notazione POSTFISSA equivale a:

(11+22)*33 in notazione INFISSA

• Non sono necessarie parentesi per controllare l'ordine delle operazioni

• La PILA è la struttura dati che con maggior naturalezza supporta la valutazione e la

trasformazione di espressioni algebriche

3

(4)

Algoritmo evalPostfix per valutare espressioni intere postfisse

Input: un’espressione aritmetica POSTFISSA

Output: il valore dell’espressione

1. Crea una pila vuota per contenere elementi di tipo intero

2. Scorri l’espressione esaminando ogni elemento (operando o operatore):

se l’elemento è un operando (un intero): inseriscilo nella pila;

se il termine è un operatore: estrai dalla pila il numero di operandi previsto per l'operatore, elabora il risultato dell'operazione su di essi e inserisci il risultato nella pila (ad es. se l’operatore è '+‘, estrai due interi dalla pila, sommali e inserisce il risultato della loro somma nella pila)

– Se la pila contiene meno del numero di operandi richiesti dall’operatore (ad es.

meno di 2 nel caso della somma), lancia un'eccezione di tipo IllegalArgumentException;

3. Dopo avere esaminato tutta l’espressione ricevuta:

se la pila contiene un solo elemento si restituisce il valore corrispondente;

Se invece la pila è vuota o contiene più di un elemento si lancia

un'eccezione di tipo IllegalArgumentException. 4

(5)

Esercizio 1

a. Si implementi e si collaudi in Java un valutatore di espressioni in notazione postfissa con operatori binari di somma + e * tra numeri interi

Il codice per operatori non commutativi, come la sottrazione e la divisione sarebbe leggermente più complicato.

b. Valutare la complessità tempo dell’implementazione dell’algoritmo così fornito.

Suggerimenti:

Implementare in Java l’algoritmo evalPostfix descritto nel lucido precedente, con un metodo avente segnatura del tipo: public int

evalPostfix (String[] expr) ovvero, che riceve in input l’espressione in notazione postfissa sottoforma di un array di stringhe (ad esempio inserita da linea di comando) e restituisce l’intero come risultato della valutazione dell’espressione.

Usare la classe predefinita Stack delle Java API JFC:

http://download.oracle.com/javase/6/docs/api/java/util/Stack.html

5

(6)

Esercizio 2

a. Meditare ed implementare in Java un

algoritmo iterativo Java public static String

inverti(String s) che prende in input una stringa s e restituisce in output la stringa ottenuta

invertendo s. La funzione deve usare come unica struttura dati ausiliaria uno stack.

b. Meditare ed implementare in Java un

algoritmo ricorsivo per lo stesso problema di cui al punto a (sfruttare lo stack delle chiamate ricorsive).

(7)

Esercizio 3

• Meditare ed implementare in Java un algoritmo public static boolean checkParentheses(String s) che prende in input una stringa che rappresenta un’espressione infissa contenente parentesi

tonde e restituisce true se e solo se le parentesi sono correttamente annidate. Usare uno stack.

• Esempi positivi: 2*7, (1+3), ((2*16)+1)*(44+(17+9))

• Esempi negativi: (44+38, ), (55+(12*11), ((()

7

(8)

Esercizio 4

• Estendere il codice di cui all’esercizio 1 in modo da include gli operatori – / e %

Riferimenti

Documenti correlati

Scrivere un metodo in linguaggio Java che, dato un array di interi a, resti- tuisca true se i suoi elementi sono in ordine non decrescente (a[0]≤ a[1] ≤.. Si consideri la

Scrivere un metodo statico iterativo che, dato un array bidimensionale a di stringhe, restituisce un array monodimensionale b di stringhe tale che b[i] `e la stringa

- un metodo che, data una stringa s che denota un titolo, restituisce true se un libro con titolo s compare nell’elenco dei libri di uno scolaro;. - un metodo che, data una stringa

Inoltre, definire un metodo che modifica il mezzo di trasporto ed il prezzo per persona, ed un metodo che restituisce una stringa che descrive un soggiorno con trasporto.

Scrivere un metodo che, dati un array bidimensionale di stringhe a ed un intero k > 0, restituisce true se in ogni riga a[i] di a esistono almeno k coppie di stringhe adiacenti

Oltre ai metodi che restituiscono i valori delle variabili istanza, definire un metodo che aggiunge il nome di un monumento nell’elenco di una via storica ed un metodo che

Inoltre, definire un metodo per modificare il nome del docente titolare di un corso, un metodo equals che restituisce true se due corsi sono uguali (altrimenti restituisce false) ed

Inoltre, definire un metodo per modificare il nome del produttore, un metodo che, dati due farmaci, controlla se appartengono alla stessa categoria e hanno lo stesso principio