Aplicações de Pilhas Pilhas são fundamentais em diversas áreas da computação: Sistemas Operacionais Arquitetura de Computadores Compiladores Entre outros.

Slides:



Advertisements
Apresentações semelhantes
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Advertisements

Pseudo-código: sintaxe
Marco Antonio Montebello Júnior
TÉCNICAS DE PROGRAMAÇÃO I
Estruturas de Repetição
Algoritmo I Aula 04 Expressões Lógicas.
Marco Antonio Montebello Júnior
Estrutura Condicional
Seminários de Compiladores
Análise Sintática Ascendente ­
Operadores Aritméticos
Introdução a Programação Renata Freire
Estruturas de repetição
Então, vamos lá! Qual é esse conteúdo?
EXPRESSÕES ARITMÉTICAS
EXPRESSÕES ARITMÉTICAS
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Programação para Engenharia I
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Construção de Compiladores
Lógica de Programação Módulo II
Descreva por palavras suas o funcionamento de um algoritmo
Programação Baseada em Objectos Desenho de TAD
Prof. Hilton Cardoso Marins Junior
PIBID – SUBPROJETO DE MATEMÁTICA CERES CAICÓ EXPRESSÕES ARITMÉTICAS
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
T ÓPICOS DE I.A. Métodos de Busca Busca em Espaços de Estado Prof. Mário Dantas.
Denise Guliato Faculdade de Computação – UFU
Tipos Abstratos de Dados
Estrutura de Dados Unidade 6 Simulação do exercício 6.2 Elaborada por Mauricio Falvo.
Introdução a Programação
Denise Guliato Faculdade de Computação – UFU
Capítulo 11 Programação Lógica
Operadores e Atribuições Capítulo 3
Listas, Filas e Pilhas Katia Guimarães.
Aula 3 Listas, pilhas, filas.
Linguagem e Ambiente Scratch
Faculdade Talentos Humanos - FACTHUS - Algoritmo I - Rogério Rodrigues
Profa. Mercedes Gonzales Márquez
Conceitos Básicos Luis Antonio Tavares
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Planilha Eletrônica - Excel
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Igor Steinmacher, MSc. O maravilhoso mundo da Lógica de Programação.
Pilhas e Filas usando Alocação Estática e Dinâmica de Memória
Árvores Binárias Profa. Patrícia A. Jaques Luiz Gonzaga Jr
Estruturas de Dados Aula 15: Árvores
Programação Funcional
Fundamentos de linguagens de programação
ALGORITMOS AULA 3. Objetivos Apresentação das estruturas básicas; Definição de tipos de dados; Seqüência de ações; Operações – Atribuições; – Entrada.
CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA ENGENHARIA DE AUTOMAÇÃO INDUSTRIAL  Operadores São meios pelo qual incrementamos, comparamos e avaliamos dados.
Algoritmos.
Linguagens Formais - aula 02
Complexidade de Computação Katia Guimarães. Avaliando a Qualidade de um Algoritmo É preciso ter bem definido –O que é dado de entrada e –O que é esperado.
Programação de Computadores - 1
Fundamentos de Programação
Equações do 1º Grau Matéria: Matemática Professora: Mariane Krull
Tipos de Dados Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem.
Linguagem de Programação I Parte IV
Andréa Iabrudi 1 Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I.
Estrutura de dados Pilhas e filas
PARADIGMAS DE LINGUAGENS EXPRESSÕES E INSTRUÇÕES DE ATRIBUIÇÃO
Prof. Edison Oliveira de Jesus
Colégio da Imaculada Colégio da Imaculada Curso Técnico em Informática
Programação estruturada unidade 2
UNIVERSIDADE FEDERAL DO AMAZONAS- UFAM INSTITUTO DE CIÊNCIAS EXATAS E TECNOLOGIA- ICET SISTEMAS DE INFORMAÇÃO ALGORITMOS E ESTRUTURAS DE DADOS II PILHAS.
Árvores e Árvores Binárias
Álgebra Booleana e Circuitos Lógicos Em 1854, George Boole introduziu o formalismo que até hoje se usa para o tratamento sistemático da lógica, que é.
Adriano A. Ribeiro. Português Estruturado Apesar do Português Estruturado ser uma linguagem bastante simplificada, ela possui todos os elementos básicos.
Lógica de Programação Aula 06 Prof. Marcelo Marcony.
Transcrição da apresentação:

Aplicações de Pilhas Pilhas são fundamentais em diversas áreas da computação: Sistemas Operacionais Arquitetura de Computadores Compiladores Entre outros Uma aplicação clássica surge na necessidade de interpretar e executar expressões.

Análise de Expressões Em determinadas aplicações, surge a necessidade de que o usuário informe fórmulas ou equações que o programa deve validar e calcular. Como avaliar a expressão abaixo? 6 – ( ( A + ( B + C ) ) / ( ( D – 3 * E ) + ( F*A+10 ) ) E descartar expressões inválidas: ( D – E ) ) D + ( E ) A / D ( + E ( D + E) ) – (A + 2

Análise de Expressões Conceitos: profundidade do agrupamento = total de parênteses de abertura encontrados cujos respectivos parênteses de fechamento ainda não foram encontrados. diferença de parênteses = total de parênteses de abertura subtraído do número de parênteses de fechamento, encontrados ao se percorrer a expressão matemática da extremidade esquerda até o ponto em análise.

Análise de Expressões Primeiro passo: analisar se a expressão é ou não válida. Tentativa de solução: 1) No final da expressão a diferença de parênteses deve ser zero. 2) A diferença de parênteses em qualquer ponto da expressão é sempre positiva. 2 + ( ( A * C ) + ( ( D - E ) / ( B - 5 ) ) - 9 ) + 20 0 0 1 2 2 2 2 1 1 2 3 3 3 3 2 2 3 3 3 3 2 1 1 1 0 0 0 ( ( F * D ) + 5 1 2 2 2 2 1 1 1 F - D ) 0 0 0 -1 ) D / E ) + ) E -1 -1 -1 -1 -2 -2 -3 -3 ( B / A) ) ) - A + 2 * D ( ( 1 1 1 1 0 -1 -2 -2 -2 -2 -2 -2 -2 -1 0

Análise de Expressões Problemas: Possível solução: [ D – B ) { [ A / 2} ] { F – 8) ] { Possível solução: Utilização somente de parênteses (problemas futuros para calcular a expressão) Utilização de pilhas!

Análise de Expressões Algoritmo usando pilhas (resultado na variável válido): valido  VERDADEIRO construir Pilha S para cada caractere c da string entrada se (c =“(“ ou c =“[“ ou c =“{ “ ) então S.Empilhe (c) fim se se (c = “)” ou c =”]” ou c =“} “) então se (S.Vazia()) então valido  FALSO senão p = S.Desempilhe() se (p não é o respectivo iniciador de caracter c) então fim para se (não S.Vazia()) então

Análise de Expressões Testar algoritmo na expressão: 2 + { [ F * 4 ] + [ ( A - B ) / ( C - 2 ) ] - 3 } + 4 [ D – B ) { [ A / 2} ] { F – 8) ] { O problema de validar ou não expressões está resolvido. Mas e para calcular o seu valor, dadas as variáveis envolvidas? - Primeiramente vamos analisar outras formas de representação de expressões, que podem facilitar o seu processamento pelo computador.

Avaliação de Expressões Representação de Expressões: Forma prefixa: notação polonesa Forma pósfixa: notação polonesa reversa Infixa Operador está entre os operandos (A + B) Prefixa Operador precede os operandos ( + AB ) Pósfixa Operador segue os operandos ( A B + )

Avaliação de Expressões Regras básicas: (a) Suponha a expressão : A+B*C (b) Coloque parênteses para reforçar a precedência: A + (B*C) (c) Converta a parte da multiplicação, obtendo : A+(BC*) (d) Suponha que D seja igual a BC*: A+D (e) Resultando em : AD+ (f) Realizando a devida substituição, ficamos com a forma final pósfixa igual à : ABC*+

Avaliação de Expressões Exemplos: Notação Infixa Notação Pósfixa A - B * C A B C * - A * ( B - C) A B C - * (A - B ) / (C + D) A B - C D + / (A - B ) / (C + D)* E A B - C D + / E * A^B * C – D + E / F / (G - H ) AB ^C * D – EF / GH - / + ((A + B) * C – ( D – E )) ^ (F - G) AB + C * DE - - FG - ^

Avaliação de Expressões Algoritmo para converter expressões: Primeiramente, é preciso estabelecer prioridades entre os operadores (e para o parênteses): método Prioridade (op) início caso op seja “(“ : retorno  1 “+”,”-“ : retorno  2 “*”,“/“ : retorno  3 “^” : retorno  4 fim caso fim

Avaliação de Expressões Passos para converter a expressão: Passo 1: • Inicie com uma pilha vazia; • Realize uma varredura na expressão infixa, copiando todos os operandos encontrados diretamente para a expressão de saída; Passo 2: Ao encontrar um operador: • Enquanto a pilha não estiver vazia e houver no seu topo um operador com prioridade maior ou igual ao encontrado, desempilhe o operador e copie-o na saída; • Empilhe o operador encontrado; Passo 3: Ao encontrar um parêntese de abertura, empilhe-o; Passo 4: Ao encontrar um parêntese de fechamento, remova um símbolo da pilha e copie-o na saída. Repita esse passo até que seja desempilhado o parêntese de abertura correspondente. Passo 5: Ao final da varredura, esvazie a pilha, movendo os símbolos desempilhados para a saída. Pronto, conseguimos obter como saída a notação pósfixa para qualquer notação infixa entrada.

Avaliação de Expressões posfixa  “” construir Pilha S para cada caractere c da string entrada caso c seja “A”..”Z”: posfixa  posfixa + c “+”,”-“, “*”,”/”,”^”: pr  Prioridade(c) enquanto ((não S.Vazia()) e (Prioridade(S.Topo())≥ pr)) faça posfixa  posfixa + S.Desempilhe() fim enquanto S.Empilhe (c) “(“ : S.Empilhe(c) “)” : x  S.Desempilhe() enquanto (x ≠ ”(“) faça posfixa  posfixa + x fim caso fim para enquanto (não S.Vazia()) faça x  S.Desempilha()

Cálculo de Expressões Uma vez que se obtenha a expressão pósfixa, o cálculo é simples por um algoritmo. Passo 1: • Inicie com uma pilha vazia; Passo 2: Varrer a expressão e, para cada símbolo encontrado na expressão, fazemos : • Se for operando, então empilhar seu valor; • Se for operador, então desempilhar os dois últimos valores. Em seguida efetuar a operação com eles. O resultado é empilhado novamente na pilha. Passo 3: No final do processo, o resultado da avaliação estará no topo da pilha.

Avaliação de Expressões Algoritmo: construir um vetor com as variáveis da expressão construir um vetor com os valores das variáveis construir Pilha S para cada caractere c da string posfixa se (c é “A”..”Z”) S.Empilhe(valor da variável c) senão y  S.Desempilhe() x  S.Desempilhe() caso c seja: “+”: S.Empilhe(x+y) “-”: S.Empilhe(x-y) “*”: S.Empilhe(x*y) “/”: S.Empilhe(x/y) “^”: S.Empilhe(x^y) fim caso fim se fim para resultado  S.Desempilhe()