# Algoritmos e Estruturas de dados 2 ## Professor Coelho
### Informações Básicas : * Bibliografia : * https://algs4.cs.princeton.edu * Sedgewick * Linguagem principal : Java, C também ( "mas foda-se a linguagem", COELHO, THE) * Monitores * **3 provas e várias provinhas de 10 minutos (toda terça)** * A nota das provinhas entra como psub * **Instalar o ambiente de programação algs4**
* # Aula 01 * Interface : É uma fronteira entre a implementação de uma biblioteca e o programa que usa a biblioteca. Ou seja, ele define estruturas de dados, nomes de função, constantes... é basicamente uma API. O cliente não precisa saber como as coisas são implementadas, por isso a interface faz essa certa separação * Cliente : É o programa que chama alguma função de uma biblioteca * Implementação : Explicita como as funções definidas na interface são feitas de fato. * Bag (saco) : Estrutura de dados que tem as seguintes operações : * add() : coloco um item * iterar : procurar todos os itens O saco pode ser usado para implementação de grafos. * Podemos definir a API de um saco de inteiros : (fazer em casa, é de boa, até porque o coelho não fez em aula e eu fiquei com preguiça rs mas é uma interface, tipo um .h) * Podemos definir a implementação da API : ```java import java.util.Iterator; // puxa as ferramentas do java pra fazer um iterador, primeiro passo public class Bag implements Iterable { // garante que vou implementar algo iterável private Node first; // instanciando um objeto da classe node, não tem problema estanciar antes de definir a classe Node private int n; private Node current; private class Node { // subclasse /*public Node (Integer item, Node next) { this.item = item; this.next = next; } Eu poderia ter feito assim tambem, mas dai eu teria que sempre escrever um "new" antes de criar um novo nó, exemplo : private current = new Node(); */ private Item item; private Node next; } public Bag() { // metodo construtor first = null; n = 0; } public void add(Integer item) { Node oldfirst = first; first = new Node(); first.item = item; first.next = oldfirst; n++; } public int size() { return n; } public boolean isEmpty() { // boolean retorn true ou false return n == 0; } public Iterator iterator() { return new BagIterator(); } private Class BagIterator implements Iterator { private Node current = first; public boolean hasNext() { return current != null; } public Item next() { Item item = current.item; current = current.next; return item; } public void remove() { throw new UnsupportedOperationException(); } } /* Métodos sem usar o iterator : public void startIterator() { current = first; } public boolean hasNext() { return current != null; // aqui não é interessante colocar um current.next == null porque dá problema caso eu tente acessar o proximo de uma lista vazia } public Item next() { Item item = current.item; current = current.next; return item; } */ } ``` Como fazer uma classe iteravel : - importo o java.util.iterator - Garanto que minha classe implementa um iteravel (implements iterable) - Implemente um método iterável * Podemos definir um cliente do saco de inteiros > ```java import edu.princeton.cs.algs4.StdOut; public class cliente { public static void main(string[] args) { Bag bag = new bag(); for (int i = 10; i < 20; i++) { bag.add(i); } StdOut.println(bag.size()); Iteratorit = bag.iterator(); for(Integer valor:bag) { // basicamente eu pego um valor dentro de bag.valor e vou iterando StdOut.println(valor); } /* Versão sem o iterador utilizado totalmente while(it.hasNext()) { Integer valor = it.next(); StdOut.println(valor) } */ /* Versão sem usar iterator bag.startIterator(4); while(bag.hasNext()) { Integer valor = bag.next(); stdOut.println(valor); }*/ } } /* GLOSSARIO DO JAVA : Estilo : Usamos camelCase em geral, nomes de função começam em letra minúscula e Nomes de objeto começam em maiúsculo (checar isso) linha1 e linha2, public : Denota que aquilo que está designado por "public" faz parte da API linha1, Cliente : aqui, o "cliente" denota em qual arquivo esse trecho tem que estar (no cliente.java). linha2, public static : O public static mostra que é função. linha2, string[]args : ssim que eu defino o main, como se fosse no C. ele toma como argumento um vetor de strings linha3, new bagInteger() : o bagInteger é a classe, o new instancia um novo objeto chamando o método construtor(que nem no js, python...) linha10, integer : é a mesma coisa que fazer um int*, ele se refere a o endereço, chamamos esse tipo de dado de variavel de referencia (como se fosse um ponteiro) : as variaveis de referencia são referenciadas pelo tipo de dado mas com a primeira letra maiúscula (Integer, Boolean, Float...). */ ``` * A api permite apenas um iterador, mas queremos vários.