ecco il metodo espressioneInfissa:
codice:
//Class per definire un'espressione Infissa
import java.io.*;
class espressioneInfissa implements Serializable
{
private String espressione;
private Pila Formula;
private Pila Operatori;
private Pila Operandi;
//------------------------------------------------
//Costruttore dell'espressione
public espressioneInfissa(String _espressione)
{
espressione = _espressione;
Formula = new Pila();
Operatori = new Pila();
Operandi = new Pila();
}
//------------------------------------------------
//Metodo che restituisce la Stringa che costituisce l'espressione
public String getEspressione()
{
return espressione;
}
//Metodo che restituisce il risultato dell'espressione, questo richiama il metodo tokenizza e il metodo svolgi operazione
public int risultato()
{
tokenizza();
while(!Formula.isEmpty())
{
String tokenCorrente = (String)(Formula.pop());//il token corrente è il segmento corrente dell'espressione
if (tokenCorrente.equals("+") || tokenCorrente.equals("*") || tokenCorrente.equals("-") || tokenCorrente.equals("/")) // se il token è un operatore
Operatori.push(tokenCorrente);//inserisci il token nella pila degli operatori
else//altrimenti
if (tokenCorrente.equals( ")" )) // se il token è la parentesi chiusa devo fare una operazione aritmetica
svolgiOperazione();//e richiamo il metodo svolgiOperazione
else // altrimenti il token è un operando
Operandi.push(tokenCorrente);//e lo aggiungo nella pila degli operandi
/*
System.out.println("TRACCIA");
System.out.println("formula"+Formula);
System.out.println("operatori"+Operatori);
System.out.println("operandi"+Operandi);
*/
}
int risultato=Integer.parseInt((String)(Operandi.pop()));
if (Operandi.isEmpty())//se nella pila degli operandi non ci sono più operandi
return risultato;//restituisce il risultato
else
{
System.out.println("espressione non ben formata");
return -1;
}
}
//Questo metodo viene richiamato dal metodo risultato, man mano che trova le ')', ed esegue
//le operazioni tra gli operandi richiesti dall'operatore, se si effettua una divisione per zero
//lancia l'eccezione aritmetica
public void svolgiOperazione()
{
int op2=Integer.parseInt((String)(Operandi.pop()));
int op1=Integer.parseInt((String)(Operandi.pop()));
String operatore = (String)(Operatori.pop());
int risultato = 0;
// vede che tipo di operazione deve eseguire in base all'operatore che viene trovato in cima alla pila
if (operatore.equals("+"))
risultato = op1+op2;
else
if(operatore.equals("*"))
risultato = op1*op2;
else
if(operatore.equals("-"))
risultato = op1-op2;
else
{
try
{
risultato = op1/op2;
}
catch(ArithmeticException e)//se non puo' eseguire operazioni restituisce un messaggio di errore(eccezione)
{
System.out.println ("Si è verificato l'errore "+e);
}
}
Operandi.push(""+risultato);//altrimenti prende il risultato e lo inserisce nella pila degli operandi
}
//Questo metodo suddivide la stringa dell'espressione in 3 pile, contenenti la formula dell'espressione
//per intero escludendo le '(', una pila contiene gli operatori ed infine l'ultima contiene gli operandi
public void tokenizza()
{
int cont = espressione.length()-1;
char corrente;
String temp = "";
while (cont>=0)
{
corrente = espressione.charAt(cont);
if(corrente == ' ')
cont--;
else
if(corrente == '(')
{
if(!temp.equals(""))
{
Formula.push(temp);
temp="";
}
cont--;
}
else
if((corrente == ')') || (corrente == '+') || (corrente == '*') || (corrente == '-') || (corrente == '/'))
{
if(temp.equals(""))
{
temp += corrente;
Formula.push(temp);
temp = "";
cont--;
}
else
{
Formula.push(temp);
temp = "";
temp += corrente;
Formula.push(temp);
temp = ""; // svuoto t
cont--;
}
}
else
{
temp = corrente + temp;
cont --;
}
}
}
}
spero che adesso mi possiate aiutare..
GRAZIE