Infixa para Pós-fixa em C
Publicado por Ivan Rocha 01/11/2007
[ Hits: 34.474 ]
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; }
Função boa para ler string em C
Lista simplesmente encadeada C
Como gerar um podcast a partir de um livro em PDF
Automatizando digitação de códigos 2FA no browser
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Conheça a 4Devs, caixa de ferramentas online para desenvolvedores
Como converter um vídeo MP4 para um GIF para publicar no README.md do seu repositório Github
Como Instalar o Microsoft Teams no Linux Ubuntu