Pilhas Filas e Listas Sumário Pilha: interface, aplicações e implementação Fila: interface, aplicações e implementação Lista Ligada: interface, aplicações e implementação Pilha Estrutura LIFO (last in, first out) Acesso restrito ao último elemento inserido Operações Inserir: push Remover: pop Pesquisar: top push pop top Cristina Ribeiro Estruturas Lineares 1
Interface // Stack interface // // ******************PUBLIC OPERATIONS********************* // void push( x ) --> Insert x // void pop( ) --> Remove most recently inserted item // Object top( ) --> Return most recently inserted item // Object topandpop( ) --> Return and remove most recent item // boolean isempty( ) --> Return true if empty; else false // void makeempty( ) --> Remove all items // ******************ERRORS******************************** // top, pop, or topandpop on empty stack public interface Stack boolean isempty( ); Object top( ) throws Underflow; void pop( ) throws Underflow; Object topandpop( ) throws Underflow; void push( Object x ); void makeempty( ); 3.8 Class Stack Class Stack em java.util public class java.util.stack extends java.util.vector (I- 3.10) // Constructors public Stack(); 3.8.1 // Methods public boolean empty(); 3.8.2 public Object peek(); 3.8.3 public Object pop(); 3.8.4 public Object push(object item); 3.8.5 public int search(object o); 3.8.6 Não usa interface: define operações da pilha como extensão de vector - permite outras operações (de vector) Cristina Ribeiro Estruturas Lineares 2
Aplicações Compilação de linguagens de programação verificação sintáctica (gramáticas) Pilha é adequada para guardar contextos, mantendo disponível o corrente chamada de procedimentos Chamada: empilha registo de activação Saída: desempilha registo correspondente visibilidade das variáveis decorre da sua posição na pilha avaliação de expressões Pilha mantém operandos, operadores e resultados intermédios expressões: conversão para notação posfixa Pilha mantém operadores até operandos respectivos estarem disponíveis Precedência e associatividade de operadores determina a ordem de saída Stack - análise Operações sobre a pilha devem ser em tempo constante inserção e remoção na pilha só envolvem o topo Implementação em array em geral: tempo constante duplicação do array: gasta tempo da ordem da dimensão do array (para a cópia) amortização: duplicação é O(N) mas o custo é distribuído pelos acessos aos N elementos adicionais obtidos; resultado é acréscimo constante em cada operação Cristina Ribeiro Estruturas Lineares 3
Fila Estrutura FIFO (first in, first out) Inserção na cauda e remoção da cabeça Operações Inserir: enqueue Remover: dequeue Pesquisar: getfront enqueue dequeue getfront Interface // ******************PUBLIC OPERATIONS********************* // void enqueue( x ) --> Insert x // Object getfront( ) --> Return least recently inserted item // Object dequeue( ) --> Return and remove least recent item // boolean isempty( ) --> Return true if empty; else false // void makeempty( ) --> Remove all items // ******************ERRORS******************************** // getfront or dequeue on empty queue public interface Queue boolean isempty( ); Object getfront( ) throws Underflow; Object dequeue( ) throws Underflow; void enqueue( Object X ); void makeempty( ); Cristina Ribeiro Estruturas Lineares 4
Lista Ligada Estrutura com nós que armazenam elementos manter referências para elementos do início e fim da lista Operações Inserir: a seguir à posição corrente Remover: na posição corrente Pesquisar: por conteúdo ou por posição first last Nós: inserção e remoção Nó da lista Class ListNode Object element; ListNode next; Inserir a seguir ao nó corrente tmp = newlistnode(); tmp.element = x; tmp.next = current.next; current.next = tmp; ou current.next = newlistnode(x, current.next); Apagar a seguir ao nó corrente current.next = current.next.next; Cristina Ribeiro Estruturas Lineares 5
Operações na Lista Operações de acesso a elementos da lista requerem referência a nós da lista Necessário garantir que acesso aos nós da lista é seguro Acesso directo aos nós da lista não garante encapsulamento de informação utilizador da estrutura pode passar referência para objecto que não é da lista Lista definida em 2 partes: a lista e o iterador classe da lista: operações são só as permitidas sobre a lista como um todo classe do iterador: suporta operações de acesso a elementos mantém referência para uma lista e posição corrente possível mais do que um iterador sobre a mesma lista Cristina Ribeiro Estruturas Lineares 6