/* questo codice mostra un possibile utilizzo di uno stack per la
* risoluzione di semplici espressioni in notazione polacca inversa
* ad esempio fornigli il seguente argomento (le virgolette sono
* obbligatorie): "3 4 9 + * 5 -" equivalente a calcolare (((4+9)*3)-5) il
* risultato e' 34 */
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include"stack.h"
int main(int argc, char **argv){
int ii;
char c;
char *expr;
int tmp;
int op1, op2;
if(argc<2)
return -1;
expr=argv[1];
/* inizializzo lo stack con 10 elementi*/
if(initSTACK(strlen(expr))){
fprintf(stderr, "errore nell'inizializzazione dello stack\n");
return -1;
}
for(ii=0; ii<strlen(argv[1]); ++ii){
/* scansione primo argomento */
c=expr[ii];
/* se e' un numero lo metto in cima allo stack */
if(isdigit((int)c)){
pushSTACK(0);
while(isdigit((int)c)){
pushSTACK(10*popSTACK()+(int)(c-'0'));
c=expr[++ii];
}
}
/* se e' uno spazio ignoro */
if(c==' ')
continue;
/* e' un operazione prelevo gli operandi, calcolo il risultato e lo metto
* in cima allo stack*/
switch(c){
case '-':
op2=popSTACK();
op1=popSTACK();
tmp=op1-op2;
pushSTACK(tmp);
break;
case '+':
pushSTACK(popSTACK()+popSTACK());
break;
case '*':
pushSTACK(popSTACK()*popSTACK());
break;
case '/':
op2=popSTACK();
op1=popSTACK();
tmp=op1/op2;
pushSTACK(tmp);
break;
case '%':
op2=popSTACK();
op1=popSTACK();
tmp=op1%op2;
pushSTACK(tmp);
default:
break;
}
}
/* se l'espressione fornita e' corretta in cima allo stack
* dovrebbe esserci il risultato */
tmp=popSTACK();
/* ora lo stack dovrebbe essere vuoto */
if(!isSTACKempty())
fprintf(stderr, "Attenzione stack non vuoto!\n");
printf("Risultato: %d\n", tmp);
destroySTACK();
return 0;
}