Obiettivo
In questo articolo tratteremo un programma che converte una stringa da
formato postfisso a formato infisso attraverso uno stack.
La notazione infissa e postfissa
La notazione infissa e' il modo comune di scrivere una espressione artimetica cioe':
(6+2)*5-8/4
Nella notazione postfissa l' operatore e' scritto dopo gli operandi
(non servono parentesi ne conoscere la precedenza ed associativita` degli operatori )
L' espressione precedente puo` essere scritta come:
3 4 + 5 * 8 4 / -
e puo` essere facilmente calcolata per mezzo di una pila usando l'algoritmo che segue.
Codice
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
typedef struct pila
{
int elem[MAX];
int top;
}PILA;
PILA *crea();
int push(PILA *,int);
int pop(PILA *,int *);
int vuota(PILA *);
int piena(PILA *);
void postfix(char *,char *,PILA *);
int valuta(char *,PILA *);
main()
{
char exp[10];
char expin[10];
PILA *p;
p=crea();
printf("inserisci stringa");
scanf("%s",exp);
postfix(exp,expin,p);
printf("risultato:%d",valuta(expin,p));
}
void postfix(char *x,char *y,PILA *p)
{
while(*x!='\0')
{
if(*x=='(');
if(*x=='+')push(p,*x);
if(*x=='-')push(p,*x);
if(*x=='*')push(p,*x);
if(*x=='/')push(p,*x);
if(*x==')')
{
pop(p,(int *)y);
y++;
}
if(*x>='0' && *x<='9')
{
*y=*x;
++y;
}
x++;
}
while(p!=NULL)
{
pop(p,(int *)y);
y++;
}
return;
}
int valuta(char *x,PILA *p)
{
int a,b,c=0;
while(*x!='\0')
{
if(*x=='+')
{
(pop(p,&a) && pop(p,&b));
c=a+b;
}
if(*x=='-')
{
(pop(p,&a)&&pop(p,&b));
c=a-b;
}
if(*x=='*')
{
(pop(p,&a)&&pop(p,&b));
c=a*b;
}
if(*x=='/')
{
(pop(p,&a)&&pop(p,&b));
c=a/b;
}
if(*x>='0'&&*x<='9')
{
scanf(x,"%d",&c);
push(p,*x);
x++;
}
}
return (int)x;
}
PILA *crea()
{
PILA *p;
p=(PILA *)malloc(sizeof(PILA));
p->top=0;
return p;
}
int vuota(PILA *p)
{
if(p->top<=0)return 1;
else return 0;
}
int piena(PILA *p)
{
if(p->top>=MAX)return 1;
else return 0;
}
int push(PILA *p,int d)
{
if(piena(p))return 0;
else
{
p->elem[p->top]=d;
p->top++;
}
return 1;
}
int pop(PILA *p,int *d)
{
if(vuota(p))return 0;
else
{
*d=p->elem[p->top];
p->top--;
}
}


One Response
questo non é C++…..è Ansi C
Perché scrivete cose a casaccio?