Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Introduzione alle pile e code in Java: strutture dati LIFO e FIFO, Schemi e mappe concettuali di Programmazione Java

Una introduzione alle pile e code in java, due strutture dati utilizzate per gestire e organizzare elementi in base al principio last-in-first-out (lifo) e first-in-first-out (fifo) rispettivamente. Il testo include esempi pratici di implementazione di pile e code utilizzando java, spiegazioni dettagliate dei metodi e operazioni comuni come push(), pop(), peek(), size() e isempty().

Tipologia: Schemi e mappe concettuali

2022/2023

Caricato il 17/01/2024

arianna-maldera-1
arianna-maldera-1 🇮🇹

7 documenti

1 / 5

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Pile e Code
1
Pile e Code
Made by Nk735
Pila
Nozioni generali
In Java, una "pila" è una struttura dati che segue il principio del Last-In-First-Out (LIFO). Può essere immaginata come una
pila di oggetti, in cui l'ultimo oggetto inserito è il primo ad essere rimosso. Questo è simile al modo in cui gli oggetti vengono
impilati in una pila del mondo reale.
La pila in Java è implementata dalla classe java.util.Stack , utilizzando metodi come push() per inserire un elemento in cima
alla pila, pop() per rimuovere l'elemento in cima alla pila e restituirlo, e peek() per ottenere l'elemento in cima senza
rimuoverlo. Alcuni altri metodi comuni includono isEmpty() per verificare se la pila è vuota e size() per ottenere il numero di
elementi nella pila.
Ecco un esempio di come utilizzare una pila in Java (l’esempio che segue non ha un reale fine pratico ma è solo teorico)
come dice il mio professore di Analisi non vi affezionate troppo al esempio:
import java.util.Stack;
public class EsempioPila {
public static void main(String[] args) {
Stack<String> pila = new Stack<>();
// Inserimento degli elementi nella pila
pila.push("Primo");
pila.push("Secondo");
pila.push("Terzo");
// Rimozione dell'elemento in cima alla pila
String elemento = pila.pop();
System.out.println("Elemento rimosso: " + elemento);
// Ottenere l'elemento in cima senza rimuoverlo (questo non sta nelle slide di mallardi ma è sempre bello sapere che essiste)
String cima = pila.peek();
System.out.println("Elemento in cima: " + cima);
// Verifica se la pila è vuota
boolean vuota = pila.isEmpty();
System.out.println("La pila è vuota? " + vuota);
// Ottenere il numero di elementi nella pila
int dimensione = pila.size();
System.out.println("Dimensione della pila: " + dimensione);
}
}
Pila basata su un Array
Una pila basata su un array è una delle possibili implementazioni di una pila in Java. In questa implementazione, una pila
viene creata utilizzando un array come struttura dati sottostante per memorizzare gli elementi.
Le caratteristiche principali di una pila basata su un array sono le seguenti:
1. Array: Viene utilizzato un array per memorizzare gli elementi della pila. L'array ha una dimensione fissa, che può essere
specificata in fase di creazione dell'oggetto pila.
2. Indice cima: Viene mantenuto un indice, chiamato "indice cima" (top), che tiene traccia dell'elemento in cima alla pila.
Inizialmente, l'indice cima viene impostato a -1 per indicare che la pila è vuota.
pf3
pf4
pf5

Anteprima parziale del testo

Scarica Introduzione alle pile e code in Java: strutture dati LIFO e FIFO e più Schemi e mappe concettuali in PDF di Programmazione Java solo su Docsity!

Pile e Code

Made by Nk

Pila

Nozioni generali

In Java, una "pila" è una struttura dati che segue il principio del Last-In-First-Out (LIFO). Può essere immaginata come una

pila di oggetti, in cui l'ultimo oggetto inserito è il primo ad essere rimosso. Questo è simile al modo in cui gli oggetti vengono

impilati in una pila del mondo reale.

La pila in Java è implementata dalla classe java.util.Stack , utilizzando metodi come push() per inserire un elemento in cima

alla pila, pop() per rimuovere l'elemento in cima alla pila e restituirlo, e peek() per ottenere l'elemento in cima senza

rimuoverlo. Alcuni altri metodi comuni includono isEmpty() per verificare se la pila è vuota e size() per ottenere il numero di

elementi nella pila.

Ecco un esempio di come utilizzare una pila in Java (l’esempio che segue non ha un reale fine pratico ma è solo teorico)

come dice il mio professore di Analisi non vi affezionate troppo al esempio:

import java.util.Stack; public class EsempioPila { public static void main(String[] args) { Stack pila = new Stack<>(); // Inserimento degli elementi nella pila pila.push("Primo"); pila.push("Secondo"); pila.push("Terzo"); // Rimozione dell'elemento in cima alla pila String elemento = pila.pop(); System.out.println("Elemento rimosso: " + elemento); // Ottenere l'elemento in cima senza rimuoverlo (questo non sta nelle slide di mallardi ma è sempre bello sapere che essiste) String cima = pila.peek(); System.out.println("Elemento in cima: " + cima); // Verifica se la pila è vuota boolean vuota = pila.isEmpty(); System.out.println("La pila è vuota? " + vuota); // Ottenere il numero di elementi nella pila int dimensione = pila.size(); System.out.println("Dimensione della pila: " + dimensione); } }

Pila basata su un Array

Una pila basata su un array è una delle possibili implementazioni di una pila in Java. In questa implementazione, una pila

viene creata utilizzando un array come struttura dati sottostante per memorizzare gli elementi.

Le caratteristiche principali di una pila basata su un array sono le seguenti:

1. Array: Viene utilizzato un array per memorizzare gli elementi della pila. L'array ha una dimensione fissa, che può essere

specificata in fase di creazione dell'oggetto pila.

2. Indice cima: Viene mantenuto un indice, chiamato "indice cima" (top), che tiene traccia dell'elemento in cima alla pila.

Inizialmente, l'indice cima viene impostato a -1 per indicare che la pila è vuota.

3. Operazioni:

Push: L'inserimento di un elemento viene effettuato incrementando l'indice cima e assegnando il nuovo elemento

all'indice corrispondente nell'array.

Pop: La rimozione dell'elemento in cima viene effettuata decrementando l'indice cima.

Peek: L'elemento in cima può essere ottenuto semplicemente accedendo all'indice cima nell'array senza modificare

l'indice stesso.

4. Limiti:

Dimensione fissa: Poiché una pila basata su un array ha una dimensione fissa, esiste un limite superiore al numero di

elementi che può contenere. Quando la pila è piena, non è possibile aggiungere ulteriori elementi finché non viene

liberato spazio rimuovendo elementi.

5. Gestione dell'overflow:

Se si tenta di effettuare un'operazione di push quando la pila è piena, si verifica un "overflow" e potrebbe essere

necessario adottare misure appropriate, come generare un'eccezione o ridimensionare l'array per consentire

l'inserimento di ulteriori elementi.

… Dopo aver capito tutto ciò e dopo aver capito le code possiamo fare un esempio di un caso pratico

Code

In Java, il termine "coda" (in inglese "queue") si riferisce a una struttura dati che segue l'approccio "FIFO" (First-In-First-Out),

ossia il primo elemento ad essere inserito è il primo a essere estratto. Una coda può essere considerata come una linea di

persone in cui il primo arrivato è il primo a essere servito.

In Java, l'interfaccia Queue è implementata da diverse classi, tra cui LinkedList. Una coda può essere utilizzata per gestire un

insieme di elementi in cui è importante mantenere l'ordine di inserimento.

Un esempio di utilizzo potrebbe essere l'implementazione di una coda per gestire un insieme di task da eseguire in ordine. I

task verrebbero aggiunti alla coda e successivamente estratti e elaborati uno alla volta, rispettando l'ordine di inserimento.

Una "coda di array" ("array queue") è un'implementazione di una coda utilizzando un array come struttura di dati sottostante.

In questa implementazione, gli elementi vengono inseriti nella coda alla fine dell'array e vengono rimossi dalla coda dalla sua

testa.

Un'implementazione semplice di una coda di array richiede un array con una dimensione fissa e due indici : uno per tenere

traccia della testa della coda e l'altro per tenere traccia della coda.

Vediamo subito un esempio così iniziamo a capirci qualcosa in più:

public class ArrayQueue { private int[] array; private int head; private int tail; public ArrayQueue(int capacity) { array = new int[capacity]; head = 0; tail = -1; } public void enqueue(int element) { if (tail == array.length - 1) { // La coda è piena System.out.println("La coda è piena. Impossibile inserire elementi."); return; } tail++; array[tail] = element;

p.push(30); p.push(40); p.push(50); p.push(60); //tutto a mano perchè gli piace scrivere System.out.println(p.pop()); System.out.println(p.pop()); System.out.println(p.pop()); System.out.println(p.pop()); System.out.println(p.pop()); System.out.println(p.pop()); //coda è uguale Coda c = new Coda(); c.inserisci(10); c.inserisci(20); c.inserisci(30); System.out.println(c.estrai()); System.out.println(c.estrai()); c.inserisci(40); c.inserisci(50); c.inserisci(60); System.out.println(c.estrai()); System.out.println(c.estrai()); System.out.println(c.estrai()); System.out.println(c.estrai()); //alla fine rimuove tutti gli elemnti dalla coda //si diverte a riempirla e a svuotarla } } Pila public class Pila { //inizializza la classe private int[] pila; // array che rappresenta la pila private int testa; // indice dell'ultimo elemento inserito nella pila // costruttore della classe Pila public Pila() { pila = new int[5]; // creiamo un array di interi con 5 elementi testa = -1; // inizializziamo la testa a -1, indicando che la pila è vuota } // metodo per inserire un elemento nella pila, questo lo devi impare a memoria public void push(int valore) { if (testa == pila.length - 1) { // se la pila è piena... System.out.println("Pila piena!"); // ... stampiamo un messaggio di errore... return; // ... e restituiamo il controllo al chiamante } testa++; // incrementiamo la testa... pila[testa] = valore; // ... e inseriamo l'elemento nella posizione indicata dalla cima //il valore che va ad inserire è quello che trova nel main } // metodo per estrarre l'ultimo elemento inserito nella pila, questo lo devi impare a memoria public int pop() { if (testa == -1) { // se la pila è vuota... System.out.println("Pila vuota!"); // ... stampiamo un messaggio di errore... return -1; // ... e restituiamo un valore predefinito (in questo caso -1) per indicare che la pila è vuota } int valore = pila[testa]; // memorizziamo il valore dell'ultimo elemento inserito... testa--; // ... decrementiamo la testa... return valore; // ... e restituiamo il valore memorizzato

Coda

Nel esempio precedente della coda io preferisco mettere all’interno del if ciò che lui fa con i boolean, entrambi i modi sono

corretti solo che a me viene più naturale farlo così. L’if così mi rattristisce. Poi per le pile lo fa mentre per le code no, perchè è

razzista verso le code non ci è dato saperlo? Io tratto tutti allo stesso modo anche perchè se mi ricordo un modo è già assai.

public class Coda { private int[] elementi; // array di interi che contiene gli elementi della coda private int testa, coda; // indice della testa e della coda della coda public Coda() { // costruttore che inizializza la coda elementi = new int[5]; // inizializza l'array con dimensione 5 testa = 0; // inizializza l'indice della testa a 0 coda = -1; // inizializza l'indice della coda a - } public boolean isVuota() { // metodo che restituisce true se la coda è vuota return (coda < testa); } public boolean isPiena() { // metodo che restituisce true se la coda è piena return (coda == elementi.length-1); } public void inserisci(int elemento) { // metodo che inserisce un elemento nella coda if (isPiena()) { // se la coda è piena, stampa un messaggio di errore e restituisce il controllo System.out.println("Errore: coda piena!"); return; } elementi[++coda] = elemento; // altrimenti, incrementa l'indice della coda e assegna l'elemento alla nuova posizione } public int estrai() { // metodo che estrae un elemento dalla coda if (isVuota()) { // se la coda è vuota, stampa un messaggio di errore e restituisce - System.out.println("Errore: coda vuota!"); return -1; } return elementi[testa++]; // altrimenti, restituisce l'elemento in testa alla coda e incrementa l'indice della testa } } Made by Nk