Infixa para Pós-fixa em C
Publicado por Ivan Rocha 01/11/2007
[ Hits: 34.783 ]
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;
}
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Necessário autenticar ao imprimir - Ubuntu X Windowns (1)
O que houve com slackware ??? (11)
O Free Download Manager não abre no Fedora 43 KDE Plasma (2)









