A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


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

1 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.

2 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

3 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.

4 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 ( ( F * D ) + 5 F - D ) ) D / E ) + ) E ( B / A) ) ) - A + 2 * D ( (

5 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!

6 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

7 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.

8 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 + )

9 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*+

10 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 - ^

11 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

12 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.

13 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()

14 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.

15 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()


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

Apresentações semelhantes


Anúncios Google