Infixa para Pós-fixa em C
Publicado por Ivan Rocha 01/11/2007
[ Hits: 34.845 ]
Homepage: http://homes.dcc.ufba.br/~ivan062/bahia
Programa que recebe como entrada uma Notação Infixa bem-formada (Ex: (A+B*C); (A*(B+C)/D-E); A+B*(C-D*(E-F)-G*H)-I*3 ) e retorna sua respectiva Notação Pós-fixa (Ex: ABC*+; ABC+*D/E-; ABCDEF-*-GH*-*+I3*-).
É feito utilizando 2 pilhas: uma auxiliar e a pilha Pós-fixa, que conterá a Expresão Pós-Fixa que será impressa no final.
# include <stdio.h>
# include <stdlib.h>
typedef struct _Pilha
{
char op;
struct _Pilha *prox;
}Pilha;
void transfereTempPos( Pilha **pPos, Pilha **pTemp, Pilha *aux )
{
aux = ( *pTemp ) -> prox;
( *pTemp ) -> prox = *pPos;
*pPos = *pTemp;
*pTemp = aux;
}
void alocaCharNaPilha( Pilha **pilha, Pilha *aux, char op )
{
aux = ( Pilha *) malloc( sizeof( Pilha ) );
aux -> op = op;
aux -> prox = *pilha;
*pilha = aux;
}
void leOperacao( Pilha **pPos, Pilha **pTemp )
{
char op;
Pilha *aux;
scanf( "%c", &op );
while( op != '\n' )
{
switch( op )
{
case '+':
case '-':
while( ( *pTemp ) && ( (*pTemp) -> op != '(' ) )
{
transfereTempPos( &( *pPos ), &( *pTemp ), aux );
}
alocaCharNaPilha( &( *pTemp ), aux, op );
break;
case '*':
case '/':
while( ( *pTemp ) && ( (*pTemp) -> op != '+' && (*pTemp) -> op != '-'
&& (*pTemp) -> op != '(' ) )
{
transfereTempPos( &( *pPos ), &( *pTemp ), aux );
}
alocaCharNaPilha( &( *pTemp ), aux, op );
break;
case ')':
while( ( *pTemp ) && ( (*pTemp) -> op != '(' ) )
{
transfereTempPos( &( *pPos ), &( *pTemp ), aux );
}
if( (*pTemp) && (*pTemp) -> op == '(' )
{
aux = *pTemp;
*pTemp = (*pTemp) -> prox;
free( aux );
}
break;
case '(':
alocaCharNaPilha( &( *pTemp ), aux, op );
break;
default:
alocaCharNaPilha( &( *pPos ), aux, op );
break;
}
scanf( "%c", &op );
}
while( *pTemp )
{
alocaCharNaPilha( &( *pTemp ), aux, op );
}
}
void imprime( Pilha *topo )
{
if( topo )
{
imprime( topo -> prox );
printf( "%c", topo -> op );
}
}
int main()
{
Pilha *pPos = NULL;
Pilha *pTemp = NULL;
printf( "Operacao Infixa: " );
leOperacao( &pPos, &pTemp );
printf( "Operacao Posfixa: " );
imprime( pPos );
printf( "\n" );
return 0;
}
Contagem de elementos de um array
Teoria do Caos - (Equação Logística)
Decimal, Hexa, Char para Binário
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Instalar e Configurar a santíssima trindade (PAP) no Void Linux
Acessando página do Synchting fora da máquina local
[Resolvido] Meu monitor suporta 100fps. Por que o máximo é 60fps nos jogos?
Jogando "Magic" gratuitamente no Linux
Novos requisitos de sistema para a versão 26.04 (0)
Como instalo o Clipper/Harbour no Linux Ubuntu (1)









