mercoledì 16 marzo 2011

Esercizi Strutture Dati - Stack


Questo è il primo di una serie di posts utili agli studenti dell'Università degli studi di Salerno che studiano Informatica o Informatica Applicata e devono sostenere l'esame di Strutture Dati (SD) o di Laboratorio di Algoritmi e Strutture Dati (LASD) con il professor Salvatore La Torre.
Nel seguito di questo articolo, e in quelli successivi, ci saranno i miei esercizi svolti durante il corso; esercizi che rappresentano un requisito essenziale per superare l'esame. Ho deciso di postare il mio lavoro per mantenerne una copia online, e in modo che chiunque possa consultarlo a piacimento; Invito i miei colleghi studenti a desistere dalla tentazione di presentarvi all'esame con i miei esercizi, (che per quanto io possa essere sicuro che siano corretti potrebbero comunque contenere errori) ma al massimo di usarli per confrontarli con i vostri.


Di seguito elenco gli esercizi sulla prima parte del corso, aggiornati al 16/03/2011



Le Eccezioni

Le eccezioni sono tutte uguali quindi ne scrivo una soltanto:

public class EmptyStackException extends RuntimeException
{
private static final String DEFAULTMSG= "Stack Vuoto!";

public EmptyStackException()
{
this(DEFAULTMSG);
}

public EmptyStackException(String err)
{
super(err);
}
}








Esercizi sullo Stack


public interface Stack <E>
{
/**
* Controlla se lo stack è vuoto.
* @return true se lo stack è vuoto, false altrimenti
*/
public boolean isEmpty();
/**
* Ottiene il valore in cima allo stack.
* @return l'elemento al top dello stack
* @throws EmptyStackException se invocato su uno stack vuoto
*/
public E top() throws EmptyStackException;
/**
* Elimina un elemento dalla cima dello stack.
* @return l'elemento cancellato
* @throws EmptyStackException se invocato su uno stack vuoto
*/
public E pop() throws EmptyStackException;
/**
* Inserisce un elemento in cima allo stack.
* @param e l'elemento da inserire
*/
public void push(E o) throws FullStackException;
/**
* Da la dimensione dello stack.
* @return un int da 0 alla dimensione massima dello stack
*/
public int size();
}



􏰀 Completare l’implementazione della classe generica ArrayStack


public class ArrayStack<E> implements Stack<E>
{
private E stack[];
private int size;
private int capacity;
public static final int CAPACITY = 1024;

public ArrayStack()
{
this(CAPACITY);
}
public ArrayStack(int cap)
{
capacity = cap;
stack = (E[])new Object[capacity];
size = 0;
}

public boolean isEmpty() 
{
return (size == 0);
}

public E top() throws EmptyStackException 
{
if (isEmpty())
throw new EmptyStackException("Stack Vuoto!");
else
return stack[size-1];
}
public E pop() throws EmptyStackException 
{
if (isEmpty())
throw new EmptyStackException("Stack Vuoto!");
else
{
E o = stack[size-1];
stack[size-1] = null;
size--;
return o;
}
}
public void push(E o) throws FullStackException
{
if (size == capacity)
//throw new FullStackException("Stack Pieno!");
{
capacity = capacity*2;
E nuovoStack[] = (E[])new Object[capacity];
for(int i=0; i<size; i++)
{
nuovoStack[i]=stack[i];
}
stack = null;
stack = nuovoStack;
nuovoStack = null;
}
stack[size] = o;
size++;
}

public int size() {
return size;
}

public String toString()
{
String response = "ArrayStack Elements:[ ";
for (int i = 0; i<size; i++)
{
response += (stack[i]+" ");
}
response+= "] size:"+size()+" capacity: "+capacity;
return response;
}
}



Scrivere un metodo Java che usa uno stack per calcolare il reverse di una stringa
􏰁 Es. Il reverse di “laboratorio” è “oirotarobal”
import java.util.*;

public class StringReverse 
{
/**
* uso uno stack per invertire una stringa
*/
public static void main(String[] args) 
{
ArrayStack<String> s = new ArrayStack<String>(5);
Scanner in = new Scanner(System.in);
System.out.print("Inserisci una riga: ");
String riga = in.nextLine();
String rigaInvertita ="";
for (int i=0; i< riga.length(); i++)
{
s.push(riga.charAt(i)+"");
}

while(!s.isEmpty())
{
rigaInvertita += s.pop();
}
System.out.println("La riga invertita è: "+rigaInvertita);
}
}


Scrivere un metodo che riceve in input una stringa contenente parentesi tonde e restituisce true se le parentesi sono ben accoppiate e false altrimenti.
􏰁 Esempio: 􏰀 x((abc)()) è un’espressione ben parentesizzata 􏰀􏰀(as(df)))( nonèun’espressionebenparentesizzata
􏰀 Modificare la funzione in modo che funzioni con stringhe contenenti sia parentesi tonde che parentesi quadre
􏰁 Esempio: 􏰀 x[(abc)()]([]) è un’espressione ben parentesizzata 􏰀 (as(df)]( non è un’espressione ben parentesizzata
import java.util.*;

public class ControlloParentesiTonde 
{
public static void main(String[] args) 
{
ArrayStack<String> s = new ArrayStack<String>(5);
Scanner in = new Scanner(System.in);
System.out.println("Verifica Annidamento Parentesi Tonde, Quadre e Graffe\n" +
  "-----------------------------------------------------");
System.out.print("Scrivi l'espressione: ");
String riga = in.nextLine();
boolean correct = true;
for (int i=0; i< riga.length(); i++)
{
try
{
if (riga.charAt(i)=='(' || riga.charAt(i)=='[' || riga.charAt(i)=='{')
s.push(riga.charAt(i)+"");
if (riga.charAt(i)==')')
{
if (s.top().equals("("))
s.pop();
}
if (riga.charAt(i)==']')
{
if (s.top().equals("["))
s.pop();
}
if (riga.charAt(i)=='}')
{
if (s.top().equals("{"))
s.pop();
}
}
catch(EmptyStackException e)
{
correct = false;
break;
}
}
if (correct && s.isEmpty())
System.out.println("Allineamento parentesi corretto");
else
System.out.println("Allineamento parentesi ERRATO");
}
}


Parte 2: Esercizi di Strutture Dati su Code e Deque

1 commento:

Related Posts with Thumbnails