Lista 02: Pilhas & Filas

Documentos relacionados
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

Tipos abstratos de dados; pilhas e filas

Algoritmos e Estrutura de Dados Aula 08 Pilhas

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

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

Estruturas de Dados Pilhas, Filas, Listas

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

Notações: in, pré e posfixada

Linguagens de Programação

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

Estruturas de Dados Pilhas, Filas, Listas

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

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

Princípios de Desenvolvimento de Algoritmos MAC122

Algoritmos e Estruturas de Dados I

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Introdução à Computação MAC0110

10.1. Aula 10: Pilhas. O conceito de pilha. Algoritmos de inserção e remoção. Exemplo: Notação Polonesa

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

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

Programação de Computadores I Dados, Operadores e Expressões PROFESSORA CINTIA CAETANO

Expressões e sentença de atribuição

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Programação das Aulas

Linguagens de Programação I

Algoritmos e Programação

Questão 1: O histograma deve ser: [0, 1, 4, 2, 0, 3, 0,, 0, 2] Exemplo: Para a matriz

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

FICHA 8 PILHAS E FILAS

3. Linguagem de Programação C

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

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

Algoritmos II prof. Daniel Oliveira

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

Ambientação com a Sintaxe de Java: parte 1

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

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

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

Introdução a Ponteiros e Vetores em C

Carlos Eduardo Batista. Centro de Informática - UFPB

INF1010 Lista de Exercícios 2

Conceitos Básicos de Programação

Variáveis, Tipos de Dados e Operadores

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

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

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

EXPRESSÕES ARITMÉTICAS PARTE 1

Algoritmos e Programação

Linguagem de Programação. Thiago Leite Francisco Barretto

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

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

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Faculdade de Computação

3.1 - Funções para manipular dados de entrada e saída padrão

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

Programação Estruturada

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Árvores Binárias de Busca

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Folha 4.2 Análise sintática ascendente

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

SCC Algoritmos e Estruturas de Dados I

Programação: Vetores

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Curso Básico de Programação Aula 11. Revisão Aula Anterior Laços de Repetição While; Do-While; For.

Árvores & Árvores Binárias

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Teoria da Computação. Unidade 3 Máquinas Universais. Referência Teoria da Computação (Divério, 2000)

Conhecendo a Linguagem de Programação C

1/50. Conceitos Básicos. Programa Básico

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

Aula prática 14. Expressão Lambda

Programação Aplicada à Engenharia

Introdução à Computação

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

CURSO BÁSICO DE PROGRAMAÇÃO AULA 11. Revisão Aula Anterior Vetores Cadeia de Caracteres

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

Exemplos. Alocação Dinâmica de Pilhas. Pilhas. Pilhas. Implementação Seqüencial X Encadeada. SCE 182 Algoritmos e Estruturas de Dados I

Transcrição:

MAC122 Princípios de Desenvolvimento de Algoritmos DCC IME USP 2º Semestre de 2018 Prof.: Dr. Paulo Miranda pmiranda@vision.ime.usp.br Lista 02: Pilhas & Filas Para as questões envolvendo pilhas, assuma a existência das funções: Pilha CriaPilha(); void LiberaPilha(Pilha p); bool PilhaVazia(Pilha p); void Empilha(Pilha p, TipoDado x); TipoDado Desempilha(Pilha p); Assuma também a definição: typedef enum boolean {false,true bool; Você deve definir TipoDado usando typedef do modo que considerar melhor.

Questão 1: Faça uma função que use uma pilha para inverter a ordem das letras de cada palavra de uma string, preservando a ordem das palavras. Por exemplo, dado o texto: EXERCICIO MUITO COMPLICADO A saída deve ser: OICICREXE OTIUM ODACILPMOC. Questão 2: Considere a família de cadeias de caracteres formadas apenas pelas letras a, b e c, seguindo o padrão: c, aca, bcb, abcba, bacab, aacaa, bbcbb,... Qualquer cadeia dessa família tem a forma WcM, onde W é uma sequência de letras que só contém a e b, e M é o inverso de W, ou seja, M é W lido de trás para frente. Faça uma função que use uma pilha para determinar se uma cadeia X pertence ou não ao nosso conjunto, ou seja, determina se X é da forma WcM. bool formawcm(char X[]); Exemplo de chamada da função: int main(){ char X[] = "abaabcbaaba"; if( formawcm(x) ) printf("pertence\n"); else printf("falso\n"); return 0;

Questão 3: Diremos que uma expressão posfixa simples é uma string cujos caracteres pertencem ao conjunto '+', '*', '0', '1',..., '9' (o caractere ' ' não faz parte do conjunto). Uma expressão posfixa simples representa uma expressão aritmética de modo alternativo, onde os argumentos precedem o símbolo da operação. Por exemplo, "123*+" representa a expressão 1 + (2*3), cujo valor é 7. Note que cada caractere numérico representa um número entre 0 e 9; assim, a sequência "48" representa o número 4 seguido do número 8, e não o número 48. Escreva uma função que receba uma expressão posfixa simples e devolva o valor da correspondente expressão aritmética. int ValorExpressao(char posfixa[]); Exemplo de chamada da função: int main(){ char pos[] = "123+*45+*6*"; int v; v = ValorExpressao(pos); printf("v: %d\n",v); /* Imprime v: 270 */ return 0;

Questão 4: Item A: Faça uma função em C que recebe em cadeia uma string não balanceada de parênteses e colchetes, e que gera em corr uma versão corrigida balanceada, através da inserção de parênteses e colchetes ausentes. O número de caracteres adicionais inseridos deve ser retornado pela função. int CorrigeBalanceamentoFA(char *cadeia, char *corr); Durante o processamento da string cadeia (da esquerda para a direita), sempre que for detectado uma falha de balanceamento, a função deve sempre resolver o conflito imediatamente através da inserção de um caractere adicional. Nessa primeira versão, considere que a função sempre dá preferência para inserir um caractere de fechamento para a resolução de conflitos, sendo que caracteres de abertura adicionais só devem ser usados se não houver outra opção imediata. Dica: Use como base o código visto em aula que verifica o balanceamento de parênteses e mostre quais modificações são necessárias para a resolução do novo problema. Exemplos: Para a cadeia = "[(])" a saída esperada na string corr é "[()]()", e o valor de retorno da função é 2, dado que dois novos caracteres foram inseridos durante a correção (ver setas). Para "[(])]" a saída em corr é "[()]()[]", e o valor de retorno é 3. Para "[(]" a saída em corr é "[()]", e o valor de retorno da função é 1. OBS: Para a resolução dessa questão, além das funções de pilhas, considere também as seguintes funções auxiliares: char ParDeAbertura(char c){ if(c==']') return '['; else if(c==')') return '('; char ParDeFechamento(char c){ if(c=='[') return ']'; else if(c=='(') return ')'; Item B: Considere agora uma segunda versão da função que sempre dá preferência para inserir um caractere de abertura para a resolução de conflitos, sendo que caracteres de fechamento adicionais só devem ser usados se não houver outra opção imediata. int CorrigeBalanceamentoAF(char *cadeia, char *corr); Exemplos: Para "[(])" a saída em corr é "[([])]", e o valor de retorno é 2. Para "[(])]" a saída em corr é "[([])]", e o valor de retorno é 1. Para "[(]" a saída em corr é "[([])]", e o valor de retorno é 3.

Questão 5: Na notação pré-fixa o operador precede os dois operandos. Exemplos: infixa a+b a+b*c (a+b)*c pré-fixa +ab +a*bc *+abc Considerando os operadores '+', '-', '*' e '/', faça uma função usando pilhas que converte uma expressão em notação infixa para pré-fixa. No caso de operadores de mesmo nível de prioridade, considere a associação à esquerda. OBS: Assim como na notação pós-fixa, a notação pré-fixa também não necessita de parênteses. A própria forma da expressão indica a ordem das operações. Questão 6: (Questão extraída da apostila "Estruturas de Dados e Técnicas de Programação" (2004) - Cláudio L. Lucchesi & Tomasz Kowaltowski) A notação pós-fixa pode ser estendida para operadores monádicos (de um operando), entretanto eles introduzem ambiguidade. Por exemplo, as expressões infixas distintas a-(-b) e -(a-b) seriam traduzidas para a mesma expressão pós-fixa ab--. A fim de evitar este problema, os operadores devem utilizar símbolos distintos na tradução. Adotando-se o símbolo ~ para o operador unário -, teríamos: a-(-b) -(a-b) ab~- ab-~ Complete a implementação da função de conversão de notação infixa para pós-fixa usando pilhas vista em aula para incluir o operador monádico '-'. Questão 7: (Questão adaptada da apostila "Estruturas de Dados e Técnicas de Programação" (2004) - Cláudio L. Lucchesi & Tomasz Kowaltowski) Em algumas aplicações é interessante utilizar o conceito de fila dupla. Nesta estrutura, as inserções e remoções podem ser feitas em qualquer uma das duas extremidades da sequência. Proponha implementações ligada e sequencial para esta estrutura e escreva as rotinas básicas para manipulá-la: FilaDupla CriaFilaDupla(); void LiberaFilaDupla(FilaDupla p); bool FilaDuplaVazia(FilaDupla p); void InsereFrenteFilaDupla(FilaDupla *p, TipoDado x); void InsereFimFilaDupla(FilaDupla *p, TipoDado x); TipoDado RemoveFrenteFilaDupla(FilaDupla *p); TipoDado RemoveFimFilaDupla(FilaDupla *p);