/* 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;
}