/* questo  codice  mostra  un  possibile  utilizzo  di  uno stack per
 * la conversione della notazione infissa in notazione postfissa 
 * ad  esempio   fornigli  il   seguente  argomento  (le   virgolette  sono
 * obbligatorie): "(((4+9)*3)-5)" equivalente in notazione polacca inversa a
 * 3 4 9 + * 5 - */

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include"stack.h"

int main(int argc, char **argv){

int ii;
char c, *expr;

if(argc<2)
 return -1;
expr=argv[1];

/* inizializzo lo stack con un numero
 * sufficiente di elementi*/
if(initSTACK(strlen(expr))){
  fprintf(stderr, "errore nell'inizializzazione dello stack\n");
  return -1;
 }


/* scansione primo argomento */
for(ii=0; ii<strlen(argv[1]); ++ii){

 c=expr[ii];

 /* controllo se ho incontrato un numero */
 if(isdigit((int)c)){
         pushSTACK(0);
	 while(isdigit((int)c)){
	     pushSTACK(10*popSTACK()+(int)(c-'0'));
	     c=expr[++ii];
	     }
	 printf("%d ",popSTACK());
         }

 if((c=='(')||(c==' '))
        continue;

 /* se e' una parentesi aperta o uno spazio ignoro   
  * se e' un'operazione la deposito sullo stack */
 switch(c){
	 case '-':
	 case '+':
	 case '*':
	 case '/':
	 case '%':
	   pushSTACK((int)c);
	   break;
	 case ')':
	   printf("%c ", (char)popSTACK());
	   break;
	 case '(':
	 case ' ':
	 default:
	   continue;
 }
}

/* estraggo eventuali operazioni fuori parentesi */
while(!isSTACKempty())
   printf("%c ", (char)popSTACK());

printf("\n");
destroySTACK();

return 0;
}