COPIARE PILA IN UN'ALTRA

di il
4 risposte

COPIARE PILA IN UN'ALTRA

Ciao a tutti,

ho un problema con le pile. In particolare, vorrei copiare il contenuto di una pila 'sorgente' in un'altra pila (vuota) 'destinatario'.
Io avevo pensato di farla in questo modo:
int main()
{
	Pila P1, P2, p; 
	P1.Push(34); 
	P1.Push(3); 
	P1.Push(18); 
	copiarePila(P1, P2); 
        return 0; 
}, 
dove la funzione copiarePila è la seguente:
void Pila :: copiarePila (Pila* sorgente, Pila* destinatario)
{ 
	for(int i=0; i<cima; i++) //cima = cima della Pila
	   destinatario[i] = sorgente[i]; 
}
Tuttavia non riesco ancora a risolvere il problema. Qualcuno ha qualche consiglio su come fare?

Grazie

4 Risposte

  • Re: COPIARE PILA IN UN'ALTRA

    Metti il codice nel tag CODE.
    Fai vedere come hai dichiarato Pila e le definizioni di Push e copiarePila, se no è impossibile trovare l'errore.
  • Re: COPIARE PILA IN UN'ALTRA

    Alexv ha scritto:


    Metti il codice nel tag CODE.
    Fai vedere come hai dichiarato Pila e le definizioni di Push e copiarePila, se no è impossibile trovare l'errore.
    Innanzitutto grazie mille per avermi risposto. Il codice sopra l'ho messo nel tag, e adesso ti allego le dichiarazioni di classe e funzioni membro:
    //file "Pila.h"
    #define DimPila 10
    typedef int TipoDato; 
    class Pila 
    {
    	protected: 
    	   TipoDato v[DimPila]; 
    	   int cima; 
    	
    	public: 
    	   Pila () { cima = -1; }
    	   ~Pila() {}
    	   //FUNZIONI MEMBRO: 
    	   void Vuota(); //crea la lista vuota
    	   TipoDato Primo(); //restituisce la cima della pila (e cioè la cima del vettore), verificando che non sia vuota
    	   bool Pvuota(); //Check se la pila è vuota
    	   void Cancellare(); //ELIMINA L'ULTIMO ELEMENTO MESSO NELLA PILA
    	   void Push (TipoDato e); 
    	   TipoDato Pop();
    	   
    	private: 
    	   bool Ppiena(); //check se la pila è piena
    }; 

    //file Pila.cpp, con dichiarazioni funzioni membro
    #include "Pila.h"
    #include <iostream>
    using namespace std; 
    
    void Pila :: Vuota()
    {
    	cima = -1; 
    }
    
    bool Pila :: Pvuota()
    {
    	return cima == -1;
    }
    TipoDato Pila :: Primo()
    {
    	if(Pvuota())
    	{
    		cerr << "Stack underfow"; 
    		exit(1); 
    	}
    	return v[cima]; 
    }
    
    void Pila :: Push (TipoDato e)
    {
    	if(Ppiena())
    	{
    		cerr << "Stak Overflow"; 
    		exit(1); 
    	}
    	//ALGORITMO DI INSERIMENTO
    	cima++; 
    	v[cima] = e;
    }
    
    bool Pila :: Ppiena()
    {
    	return cima == DimPila - 1; 
    }
    
    TipoDato Pila :: Pop()
    {
    	TipoDato aux; 
    	//CHECK CHE LA PILA NON SIA VUOTA
    	if(Pvuota())
    	{
    		cerr << "Stak Underflow";  
    		exit(1); 
    	}
    	aux = v[cima]; 
    	cima--; 
    	return aux; 
    }
    
    void Pila :: Cancellare ()
    {
    	if(Pvuota())
    	{
    		cerr << "Stak Underflow";  
    		exit(1); 
    	}
    	cima --; 
    }

    In realtà quello che mi crea difficoltà è proprio la funzione di copia (allegata nel primo messaggio) del contenuto di una pila nell'altra; anche perché poi dopo so come riempire la pila.

    Grazie mille ancora per l'aiuto.
  • Re: COPIARE PILA IN UN'ALTRA

    Descrivi anche il problema. Da quello che vedo:

    1. È sbagliato l'algoritmo, visto che non incrementa la cima della destinazione.

    2. Gli argomenti sono puntatori, quindi il passaggio va fatto con la & commerciale, mentre l'accesso ai dati membri con la "freccetta" (->). Perché non usi il passaggio per riferimento che è più comodo?

    3. Non vedo la dichiarazione di CopiarePila. Se deve essere una funzione membro non statica, la chiamata andrebbe fatta in questo modo:
    
    P1.copiarePila(&P2);
    
    Mentre la dichiarazione:
    
    void copiarePila(Pila* sorgente);
    
    Se invece vuoi chiamarla come hai fatto tu e accettare due argomenti, va dichiarata static o friend.
  • Re: COPIARE PILA IN UN'ALTRA

    Visto che non hai usato <stack>, immagino che l'esercizio sia a scopo didattico. La soluzione sarebbe quella di usare una funzione ricorsiva per la copia così come faresti per la stampa (senza svuotare la pila, se non temporaneamente). Farla con un for su un array non aggiunge nulla alla tua formazione...
Devi accedere o registrarti per scrivere nel forum
4 risposte