Tipo de Dados Abstractos: Pilha (stack)



Documentos relacionados
Pilhas Filas e Listas

ESTRUTURA DE DADOS PILHA

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Estruturas de Dados Pilhas, Filas e Deques

Pilhas. Profa Morganna Diniz

Pedro Vasconcelos DCC/FCUP. Programação Funcional 14 a Aula Tipos abstratos de dados

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

Estrutura de Dados Básica

Avaliação de Expressões

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Árvores. Algoritmos e Estruturas de Dados 2005/2006

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

Guia de Consulta Rápida C++ STL. Joel Saade. Novatec Editora

STL significa Standard Template Library. É uma biblioteca que contém algumas estruturas de dados, como árvore binária e lista encadeada.

Listas Duplamente Encadeadas

Programa ConsoleRPN. PUC-Rio CIV Sistemas Gráficos para Engenharia Luiz Fernando Martha & André Maués Brabo Pereira

Algoritmos de Pesquisa e Ordenação em Vectores

Métodos Computacionais. Fila

ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira

Busca. Pesquisa sequencial

Estrutura de Dados Pilha (Stack)

Introdução a POO. Introdução a Linguagem C++ e POO

Métodos Computacionais. Árvores

INF 1007 Programação II

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

Expressões. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Pilhas e Filas. Conteúdo. FEUP/LEEC Algoritmos e Estruturas de Dados 2001/2002. João Canas Ferreira

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria

Composição de classes

DAS5102 Fundamentos da Estrutura da Informação

Aula 8- Standard Template Library. Arthur Ribacki Gabriel Portal Leonardo Chatain Luiz Fernando Scheidegger Rosália Schneider

Analise o código abaixo:

Capítulo 2: Introdução à Linguagem C

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Tipo de Dados em Linguagem C

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

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

Componentes da linguagem C++

Métodos de Pesquisa em Memória Primária

FACULDADE DE TECNOLOGIA SENAC GOIÁS ADELTON HENRIQUE ABISHAI LEMES BORGES NETO HENRIQUE FERREIRA DA SILVA

Aula 1. // exemplo1.cpp /* Incluímos a biblioteca C++ padrão de entrada e saída */ #include <iostream>

Universidade Federal de Uberlândia Faculdade de Computação

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

INF 1005 Programação I

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

Vectores em C++ Classe vector: Introdução

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E AULA TEÓRICA 4 PROF. MARCELO LUIZ SILVA (R E D)

Tipos de Dado Abstrato: Listas, Filas e Pilhas

Lista 02: Pilhas & Filas

Algoritmos e Estrutura de Dados II

Curso : Tecnologia em Desenvolvimento de Sistemas - AEMS

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Programação 2. Trabalho Prático P4B. Efectue as tarefas de programação descritas abaixo, usando a linguagem C++ em ambiente Linux.

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

Estruturas de entrada e saída

Pesquisa em Memória Primária. Prof. Jonas Potros

EAD Árvore árvore binária

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

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

Pesquisa Sequencial e Binária

ESTRUTURA CONDICIONAL

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

2ª Lista de Exercícios

Trabalho 3: Agenda de Tarefas

Princípios de programação em Linguagem C++

Conceito de classe em C++

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada;

Filas de prioridade. Algoritmos e Estruturas de Dados AED 2005/2006 AEDA 2009/2010

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

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

PYTHON LISTAS. Introdução à Programação SI2

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Estruturas (Registros)

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM C/C++ Prof. Dr. Daniel Caetano

Funções recursivas. O exemplo mais comum: int fat(int n){ if(n == 0) return 1; return n*fat(n-1); }

e à Linguagem de Programação Python

Estruturas de Dados Aula 15: Árvores 17/05/2011

Árvores e Árvores Binárias

Filas COMANDOS EM C++ PARA IMPLEMENTAÇÃO DE UMA FILA. Biblioteca padrão <queue>

Algoritmos de pesquisa. Tabelas de dispersão/hash

Transcrição:

Tipos de Dados Abstractos Estruturas Lineares Pilhas e Filas FEUP - MIEEC Programação - 008/009 Tipo de Dados Abstractos: Pilha (stack) Pilha estrutura de dados linear em que: inserção e a remoção de elementos se faz pela mesma extremidade, designada por topo da pilha uma pilha pode ser considerada como uma restrição de lista porque é uma estrutura de dados mais simples que a lista, é possível obter implementações mais eficazes não usa iteradores estrutura do tipo LIFO (Last-In-First-Out) Exemplos de utilização tabuleiro de recepção de serviço de um administrativo! zona de memória auxiliar da execução de rotina de programação

TAD: Pilhas Operações mais usuais: criar uma pilha vazia adicionar/remover um elemento à pilha verificar qual o topo da pilha (último elemento adicionado) push() push() push() push() push() pop() pop() pop() pop() Classe stack (STL) Alguns métodos da classe stack (STL): stack() stack(const stack &) bool empty() const size_type size() const T & top() void push(const T &) void pop() stack & operator =(const stack &) Funções globais (não membros da classe stack): bool operator ==(const stack &, const stack &) bool operator <(const stack &, const stack &) http://www.sgi.com/tech/stl/stack.html http://www.cppreference.com/cppstack

Pilhas: aplicação Notação RPN (Reverse Polish Notation) expressões matemáticas onde os operadores surgem a seguir aos operandos (notação posfixa) ex: + vantagem: não requer parêntesis nem regras de precedência outras notações: Notação infixa (comum): os operadores surgem entre os operandos ex: + Notação prefixa: os operadores surgem antes dos operandos ex: + exemplo: Notação infixa: * ( + ) / Notação RPN: + * / Pilhas: aplicação Avaliação de expressões RPN : algoritmo. Processar sequencialmente os elementos da expressão. Para cada elemento:. Se o elemento for um número (operando), colocá-lo na pilha.. Se o elemento for um operador... Retirar os dois elementos do topo da pilha... Processar os elementos de acordo com o operador... Colocar o resultado na pilha. Retirar o (único) elemento da pilha. É o resultado 6

Pilhas: aplicação class Elemento public: float valor; // valor=0 se elemento é operador char op; // op=? se elemento é operando Elemento(float v=0, char o='?'): valor(v), op(o) ; ; float calcop(float v, float v, char op) switch(op) case '+' : return v+v; case '-' : return v-v; case '*' : return v*v; case '/' : return v/v; default: cout << operação inválida <<endl; 7 Pilhas: aplicação float avaliarpn(string expressao) // simplificação: números de dígito apenas stack<elemento> pilha; for ( int i=0; i<expressao.length(); i++ ) if ( expressao[i]>='0' && expressao[i]<='9') // é numero pilha.push(elemento(expressao[i]-8,'?')); else float num = pilha.top().valor; pilha.pop(); float num = pilha.top().valor; pilha.pop(); float res = calcop(num, num, expressao[i]); pilha.push(elemento(res,'?')); float res = pilha.top().valor; pilha.pop(); return res; 8

Tipo de Dados Abstractos: Fila (queue) Fila estrutura de dados linear em que: inserção de elementos se faz por uma extremidade, designada por cauda remoção de elementos se faz por extremidade oposta à cauda, designada por cabeça uma fila pode ser considerada como uma restrição de lista não usa iteradores estrutura do tipo FIFO (First-In-First-Out) Exemplo fila de atendimento numa caixa de supermercado 9 TAD: Filas Operações mais usuais: criar uma fila vazia adicionar/remover um elemento a uma fila verificar qual o elemento da cabeça/cauda da fila (mais antigo/recente) front back front back front back front back push() push() push() push() front back front back front back front back pop() pop() pop() 0

Classe queue (STL) Alguns métodos da classe queue (STL): queue() queue(const queue &) bool empty() const size_type size() const T & front() T & back() void push(const T &) void pop() queue & operator =(const queue &) Funções globais (não membros da classe queue): bool operator ==(const queue &, const queue &) bool operator <(const queue &, const queue &) http://www.sgi.com/tech/stl/queue.html http://www.cppreference.com/cppqueue Filas: aplicação Pretende-se implementar uma classe para gerir a fila de impressão de uma impressora de rede. a impressora de rede, quando recebe um ficheiro para impressão, adiciona-o numa fila de espera do tipo FIFO. class Documento string nome; string utilizador; int tamanho; int nfolhas; public: Document(string n, string ut, int t, int f): nome(n), utilizador(ut), tamanho(t), nfolhas(f) string getutil() const return utilizador; string getnome() const return nome; int gettamanho() const return tamanho; int getnfolhas() const return nfolhas; void setnfolhas(int n) nfolhas=n; ;

Filas: aplicação class Impressora queue<documento> filaimpressao; int maxmemoria; int folhasrestantes; // nº folhas existentes na impressora public: Impressora(int m, int f): maxmemoria(m), folhasrestantes(f) void adicionardocumento(documento doc); Documento imprimirdocumento(); void trocartoner(int numerofolhas); // a implementar void listardocumentos(ostream& os); // a implementar void excluirdocumento(string n, string o); ; Filas: aplicação // adiciona um novo documento à fila de impressão. Se o tamanho do documento é superior à memória // disponível na impressora, o documento é ignorado. void Impressora::adicionarDocumento(Documento doc) //calcula memória consumida int memoriaconsumida = 0; queue<documento> temp(filaimpressao); while(!temp.empty()) memoriaconsumida += temp.front().gettamanho(); temp.pop(); //adiciona documento if( (maxmemoria - memoriaconsumida) >= doc.gettamanho() ) filaimpressao.push(doc); cout << nº docs na fila: << filaimpressao.size() << endl;

Filas: aplicação // imprime o próximo documento na lista de impressão. Se o documento for impresso na // totalidade, sai da fila. Caso não haja toner na impressora suficiente para imprimir todas as páginas do // documento, imprime as páginas que forem possíveis, deixando o restante para ser impresso mais tarde Documento Impressora::imprimirDocumento() Documento d = filaimpressao.front(); if( folhasrestantes >= d.getnfolhas() ) folhasrestantes -= d.getnfolhas(); filaimpressao.pop(); else int nfolhasdoc= d.getnfolhas()-folhasrestantes; filaimpressao.front().setnfolhas(nfolhasdoc); folhasrestantes = 0; cout << não foram impressas todas as folhas << endl; return d; Filas: aplicação // retira da fila de impressão o documento de nome n, pertencente ao utilizador ut. Caso encontre // mais do que um documento, todos devem ser retirados da fila de impressão. void Impressora::excluirDocumento(string n, string ut) queue<documento> temp; //apaga todos os documentos com nome n e utilizador ut while(!filaimpressao.empty()) if( (filaimpressao.front().getnome() == n) && (filaimpressao.front().getutil() == ut) ) filaimpressao.pop(); else temp.push( filaimpressao.front() ); filaimpressao.pop(); filaimpressao = temp; 6