Infixa para Pós-fixa em C
Publicado por Ivan Rocha 01/11/2007
[ Hits: 34.156 ]
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; }
[C] Decompositor de números em fatores primos
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisão de valores flutuantes em python[AJUDA] (9)
GLPI - Configuração de destinatário com conta Microsoft Exchange (0)
Vou voltar moderar conteúdos de Dicas e Artigos (3)
OpenVPN no MACBOOK conecta mas não pinga pastas de rede compartilhada ... (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta