Notações: in, pré e posfixada

Documentos relacionados
SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Lista 02: Pilhas & Filas

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

3. Linguagem de Programação C

Filas Exemplo de Aplicação

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

Introdução à Programação em C (II)

Aula de hoje. Expressões. Expressões. Expressões. Exemplos. Programa em Python. SCC Introdução à Programação para Engenharias

Introdução à Programação em C Input / Output

Analise o código abaixo:

Pilha. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof. Gustavo Batista

Capítulo 2 Operadores. A função scanf()

Introdução a JAVA. Variáveis, tipos, expressões, comandos e blocos

Linguagens de Programação

Avaliação de expressões. Prof: Sérgio Souza Costa

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Introdução à Programação. Expressões Booleanas e Comandos Condicionais

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Linguagem Java - Introdução

Pilhas e Filas. Nádia Félix e Hebert Coelho

Programação: Vetores

Algoritmos e Estrutura de Dados Aula 08 Pilhas

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

EXPRESSÕES ARITMÉTICAS PARTE 1

Programação Estruturada

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

PIC - PROGRAMAÇÃO LINGUAGEM C. AUTOR: ENG. ANTONIO CARLOS LEMOS JÚNIOR

Algoritmos e Programação

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Carlos Eduardo Batista. Centro de Informática - UFPB

Diagramas Sintáticos

Linguagem C (estruturas condicionais)

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Estrutura de Condição, Escolha e Repetição

Programação II. Aula 3

Princípios de Desenvolvimento de Algoritmos MAC122

Capítulo 7. Expressões e Sentenças de Atribuição

Variáveis, Tipos de Dados e Operadores

Estruturas de Dados Pilhas, Filas, Listas

Simulado de Linguagem de Programação Java

Introdução à Linguagem C Variáveis e Expressões

Aula 03 -Introdução àlinguagc Programação: Estrutura-Repetição. OPL e IC1 Prof: Anilton Joaquim da Silva

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Introdução à Programação. Estruturas de Repetição

ponteiros INF Programação I Prof. Roberto Azevedo

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Guia de bolso - Prof. César Melo

Linguagens de Programação I

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

controle de fluxo - condicionais

2 Aplicação Pilha: Avaliador de Expressões Simples

Linguagem C: Introdução

Parte 1. Programação (linguagem C) Introdução Geral

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

Tipos de dados e comandos POO

Estruturas Compostas Parte II

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Aula 6 Oficina de Programação Estruturas Condicionais no C. Profa. Elaine Faria UFU

Referências. Linguagem C. Tipos de variáveis em XC8. Tipos de variáveis. Tipos de variáveis em XC 8 Exemplo. Radicais numéricos em C

Introdução à Computação MAC0110

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

Transcrição:

Notações: in, pré e posfixada Como avaliar uma expressão posfixada? A resposta a esta pergunta, vem de uma análise. Estamos tratando de operações binárias. Portanto, devemos avaliar a expressão da esquerda para direita, em busca de dois operandos consecutivos seguidos de um operador, neste momento aplicamos a operação sobre os respectivos operandos, substituindo-os, na expressão, pelo resultado e continuando em seguida com a análise. 334

Notações: in, pré e posfixada Exercício Vamos agora escrever um algoritmo para avaliar uma expressão aritmética posfixada. Devemos inicialmente definir a entrada, ou seja, de que forma representaremos nossa expressão. Sendo assim, vamos imaginar uma string representando a expressão posfixada. Para não tornarmos o algoritmo muito complexo e não nos desviarmos do nosso foco principal. Desta forma nossos operandos serão positivos e compostos por apenas um dígito. 335

int avaliar (char *e) char symbol; int i=0; PILHA_ENC pilha_operandos; cria_pilha (&pilha_operandos); while (symbol = e[i++]) if (eh_operando(symbol)) push (&pilha_operandos, (float)(symbol- '0')); else int op2=top_pop(&pilha_operandos), op1=top_pop(&pilha_operandos); push (&pilha_operandos, aplicar (op1, symbol, op2)); return (top_pop(&pilha_operandos)); 336

int eh_operando(char op) 337 return (op!= '+' && op!= '- ' && op!= '*' && op!= '/' && op!= '^'); int aplicar (int operando1, char operador, int operando2) switch (operador) case '+': return (operando1 + operando2); case '- ': return (operando1 - operando2); case '*': return (operando1 * operando2); case '/': return (operando1 / operando2); case '^': return ((int)pow(operando1, operando2));

main() char expr [MAXCOLS]; int position = 0; while ((expr[position++] = getchar ())!= '\n'); expr[--position]='\0'; printf ("%s%s","a expressão posfixada original eh ",expr); printf (" = %d\n", avaliar(expr)); 338

339 Notações: in, pré e posfixada Já construímos um algoritmo para avaliar expressões posfixadas, agora, vamos tratar o problema de converter uma expressão infixada em uma pofixada. Inicialmente trataremos apenas a questão da precedência, deixando a questão da utilização de parênteses para uma análise posterior. Definiremos agora uma função simples, cujo objetivo é verificar a precedência entre operadores.

int prcd (char op1, char op2) if ((op1=='+' op1=='-') && (op2=='+' op2=='-')) return (1); if ((op1=='*' op1=='/') && (op2=='+' op2=='-' op2=='*' op2=='/')) return (1); if (op1=='^' && (op2=='^' op2=='+' op2=='-' op2=='*' op2=='/')) return (1); return (0); 340

Notações: in, pré e posfixada Agora, veremos uma função que converte uma string infixada sem parênteses em uma string posfixada. void converter_s_p(char *o, char *d) char symbol; int i1=0, i2=0; PILHA_ENC opstk; cria_pilha (&opstk); 341

342 while (symbol=o[i1++]) if (eh_operando(symbol)) d[i2++]=symbol; else while (!eh_vazia(opstk) && prcd (top(opstk),symbol)) d[i2++]=top_pop(&opstk); push(&opstk, symbol); while (!eh_vazia(opstk)) d[i2++]=top_pop(&opstk); d[i2]='\0';

343 Notações: in, pré e posfixada Que alterações seriam necessária para que o algoritmo anterior seja capaz de converter uma string infixada com parênteses em uma string posfixada? São necessárias apenas pequenas alterações. Quando um parêntese de abertura for lido, ele deverá ser introduzido na pilha (prcd(op, ( ) é FALSE para todo símbolo de op diferente de um parêntese direito). Além disso, também vamos definir prcd( (, op) como FALSE para todo símbolo de op exceto ), que discutiremos depois.

344 Notações: in, pré e posfixada Quando um parêntese de fechamento for lido, todos os operadores até o primeiro parêntese de abertura deverão ser retirados da pilha e inseridos na string posfixada. Isso pode ser feito definindo-se prcd(op, ) ) como TRUE para todos os operadores op diferentes de um parêntese esquerdo. Quando esses operadores forem removidos da pilha e o parêntese de abertura for descoberto, uma ação especial deve ser tomada. O parêntese de abertura deve ser removido da pilha e descartado, juntamente com o parêntese de fechamento, em vez de colocado na string posfixada ou na pilha. Vamos definir prcd ( (, ) ) como FALSE.

345 Notações: in, pré e posfixada Isto garantirá que, o parêntese de abertura não seja inserido na string posfixada. Entretanto, como o parêntese de fechamento não deve ser introduzido na pilha, faremos a seguinte alteração: if (symbol== ) ) pop(&opstk); else push(&opstk, symbol); Logo, com estas pequenas alterações podemos fazer uma função para converter uma string infixada qualquer em uma string posfixada.

Notações: in, pré e posfixada - Exercício Com base no que vimos construa um programa, na linguagem C, que leia da entrada padrão uma string representando uma expressão infixada, com presença de parênteses) a converta em posfixada e a avalie retornando na saída padrão o resultado da avaliação. 346

Alocação Encadeada O mesmo que discutimos a respeito das filas ocorre com as pilhas. Ou seja, uma pilha nada mais é do que uma lista com uma disciplina de acesso. Logo, podemos nos utilizar de todos os conceitos vistos em listas para implementarmos pilhas. Por exemplo, podemos utilizar uma lista encadeada com nó cabeçalho para armazenar uma fila. 357