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