Infixa para Pós-fixa em C
Publicado por Ivan Rocha 01/11/2007
[ Hits: 34.697 ]
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;
}
Boletim Escolar Com Manipulação de Arquivo
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como montar um servidor de backup no linux
Trazendo de volta o Serviços em Segundo Plano no Plasma6
Ativando e usando "zoom" no ambiente Cinnamon
Vídeo Nostálgico de Instalação do Conectiva Linux 9
Como realizar um ataque de força bruta para desobrir senhas?
780 mil usuários do Janelas baIxaram Linux em um mês (4)
Servidor para arquivos e banco de dados (2)
Atualizei meu ubuntu e desliguei e ele não inicia corretamente (12)









