Problema estrazione elemento da una pila c++

di il
3 risposte

Problema estrazione elemento da una pila c++

Salve, vi scrivo riguardo ad un problema che ho avuto con un esercizio che metto qui di seguito:

Si implementi una classe Pila, attraverso l'utilizzo dei template, contenente elementi di tipo generico H. La classe dovrà implementare la procedura push, la procedura pop, e la procedura di stampa degli elementi in essa contenuti. La stampa dovrà essere effettuata procedendo dalla testa della Pila fino all'elemento che si trova in base ad essa.
L’input è suddiviso in 100 task, uno per ogni riga. Ogni riga del file di input è formata da 2+N elementi. Il primo elemento è una stringa che identifica il tipo di dato (H) che dovrà essere contenuto all'interno della Pila. Il secondo elemento è un valore intero N, il quale rappresenta l'insieme delle operazioni che dovranno essere eseguite nella struttura dati (push e pop). Seguono N elementi che rappresentano, nell'ordine dato, le operazioni che dovranno essere eseguite all'interno della Pila. Un'operazione di inserimento (push) di un elemento, "v", di tipo H è rappresentata dal carattere "i" concatenato con il valore di "v". Un'operazione di cancellazione (pop) è invece rappresentata dalla stringa "pop".

Task di esempio:
input.txt:
bool 10 i1 i0 pop pop i1 i0 i0 i1 i1 i0
char 10 ij ir pop it iq ir im ik it it
int 10 i13 i17 i6 pop i15 i2 i9 pop pop i5

output.txt
0 1 1 0 0 1
t t k m r q t j
5 15 17 13

Vi posto il mio codice:

#include <iostream>
#include <fstream>
#define MAX 200

#define INPUT_FILE "input.txt"
#define OUTPUT_FILE "output.txt"

using namespace std;

fstream infile, outfile;


template <class H>
class Pila {
    private:
        int testa;
        H vett[MAX];
    public:
        Pila() {
            testa = 0;
        }
        void push(H val) {
            vett[testa] = val;
            testa++;
        }
        
        void pop(H val) {
            vett[--testa];
        }
        
        void stampa() {
            for (int i=testa; i>0; i--) {
                outfile << vett[i] << " ";
            }
            outfile << endl;
        } 
};

int main() 
{
    infile.open(INPUT_FILE, fstream::in);
    outfile.open(OUTPUT_FILE, fstream::out);
    for (int i=0; i<100; i++)
    {
        string type;
        int N;
        infile >> type;
        infile >> N;
        
        if (type=="int")
        {
            Pila<int> p;
            string a;
            int x;
            for (int i=0; i<N; i++)
            {
                infile >> a;
                if(a=="i") {
                    infile >> x;
                    p.push(x); 
                }
                else if (a=="pop") 
                {
                    p.pop(x);
                }
            }
            p.stampa();
        }

        else if(type=="double")
        {
            Pila<double> p;
            string a;
            double x;
            for (int i=0; i<N; i++) 
            {
                infile >> a;
                if(a=="i") {
                    infile >> x;
                    p.push(x); 
                }
                else if (a=="pop") 
                {
                    p.pop(x);
                }
            }
            p.stampa();
        }

        else if(type=="bool") 
        {
            Pila<bool> p;
            string a;
            bool x;
            for (int i=0; i<N; i++)
            {
                infile >> a;
                if (a=="i") {
                    infile >> x;
                    p.push(x);
                }
                else if (a=="pop") {
                    p.pop(x);
                }
            }
            p.stampa();
        }
     
        else if(type=="char")
        {
            Pila<char> p;
            string a;
            char x;
            for (int i=0; i<N; i++) 
            {
                infile >> a;
                if (a=="i") {
                    infile >> x;
                    p.push(x);
                }
                else if (a=="pop") {
                    p.pop(x);
                }
            }
            p.stampa();
        }
        
    }
    infile.close();
    outfile.close();
    return 0;
}
Il programma compila ma in output stampa tutti 0, e credo che la causa stia nel fatto che non riesco a capire come fare per fargli capire quando inserire o estrarre un dato, cioè se creo un oggetto in cui entrano interi, come faccio a mettere una condizione che legga se c'è il carattere i o la stringa pop e di conseguenza eseguire la funzione di inserimento o estrazione dalla pila?
Spero mi possiate aiutare, grazie in anticipo!

3 Risposte

  • Re: Problema estrazione elemento da una pila c++

    Innanzitutto vett[--testa]; non ha senso: per quello che vuoi fare è --testa; oppure testa--;

    In secondo luogo: qual è la definizione di stringa? "i1" non è una stringa? "i1 i0" non è una stringa? Hai controllato con ildebugger o con il cout quanto vale a?

    Ci sono molti modi per risolvere il tuo problema, ma prima devi avere le idee chiare sugli strumenti che stai usando
  • Re: Problema estrazione elemento da una pila c++

    Oltre al fatto che pop dovrebbe avere dei controlli prima di andare out of bounds…
  • Re: Problema estrazione elemento da una pila c++

    Weierstrass ha scritto:


    Innanzitutto vett[--testa]; non ha senso: per quello che vuoi fare è --testa; oppure testa--;

    In secondo luogo: qual è la definizione di stringa? "i1" non è una stringa? "i1 i0" non è una stringa? Hai controllato con ildebugger o con il cout quanto vale a?

    Ci sono molti modi per risolvere il tuo problema, ma prima devi avere le idee chiare sugli strumenti che stai usando
    Si, dopo avevo controllato il debugger, ma alla fine ho riscritto il tutto in un altro modo, ora funziona perfettamente, ve lo posto:
    
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    template <class H>
    class Nodo{
        protected:
            H elemento;
            Nodo<H>* succ;
        public:
            Nodo(H _el): elemento(_el){
                this->succ = NULL;
            }
    
            //Get
            H getElemento(){return elemento;}
            Nodo<H>* getSucc(){return succ;}
    
            //Set
            void setSucc(Nodo<H>* succ){this->succ = succ;}
    };
    
    template <class H>
    class Stack{
        protected:
            Nodo<H>* testa;
        public:
            Stack(){this->testa = NULL;}
            ~Stack();
            void Push(H);
            void Pop();
            void print(ofstream&);
    };
    
    template <class H> Stack<H>::~Stack(){
        Nodo<H>* iter = testa;
        Nodo<H>* tmp;
    
        while(iter != NULL){
            tmp = iter->getSucc();
            delete iter;
            iter = tmp;
        }
    }
    
    template <class H> void Stack<H>::Push(H x){
        Nodo<H>* nuovo = new Nodo<H>(x);
    
        nuovo->setSucc(testa);
        testa = nuovo;
    }
    
    template <class H> void Stack<H>::Pop(){
        if(testa != NULL){
            Nodo<H>* tmp = testa;
            testa = testa->getSucc();
            delete tmp;
        }
    }
    
    template <class H> void Stack<H>::print(ofstream &out){
        Nodo<H>* iter = testa;
    
        while(iter != NULL){
            out << iter->getElemento() << " ";
            iter = iter->getSucc();
        }
        out << endl;
    }
    
    int main(){
        
        ifstream in("input.txt");
        ofstream out("output.txt");
    
        for(int i = 0; i < 100; i++){
            string type; 
            in >> type;
            cout << type << endl;
            int n; 
            in >> n;
    
            if(type == "int"){
                Stack<int>* t = new Stack<int>();
                for(int j = 0; j < n; j++){
                    string tmp; 
                    in >> tmp;
                    
                    if(tmp == "pop")
                        t->Pop();
                    else{
                        string _value = tmp.substr(1, tmp.length());
                        int val = stoi(_value);
                        t->Push(val);
                    }
                }
                t->print(out);
                delete t;
            }
            else if(type == "double"){
                Stack<double>* t = new Stack<double>();
                for(int j = 0; j < n; j++){
                    string tmp; 
                    in >> tmp;
                    
                    if(tmp == "pop")
                        t->Pop();
                    else{
                        string _value = tmp.substr(1, tmp.length());
                        double val = stod(_value);
                        t->Push(val);
                    }
                }
                t->print(out);
                delete t;
            }
            else if(type == "bool"){
                Stack<bool>* t = new Stack<bool>();
                for(int j = 0; j < n; j++){
                    string tmp; in >> tmp;
                  
                    if(tmp == "pop")
                        t->Pop();
                    else{
                        string _value = tmp.substr(1, tmp.length());
                        bool val = stoi(_value);
                        t->Push(val);
                    }
                }
                t->print(out);
                delete t;
            }
            else if(type == "char"){
                Stack<char>* t = new Stack<char>();
                for(int j = 0; j < n; j++){
                    string tmp; in >> tmp;
                    
                    if(tmp == "pop")
                        t->Pop();
                    else{
                        string val = tmp.substr(1, tmp.length());
                        t->Push(val[0]);
                    }
                }
                t->print(out);
                delete t;
            }
            
        }
    }
    
    
    
    Grazie comunque per i vostri consigli!
Devi accedere o registrarti per scrivere nel forum
3 risposte