Implementacja stosu o roznych typach danych

Odpowiedz Nowy wątek
2010-12-06 15:27

Rejestracja: 9 lat temu

Ostatnio: 8 lat temu

0

Witam mój problem polega na tym że nie wiem jak zaimplementować stos przechowujący różne typy danych program który napisałem nie działa jak należy.
I mam prośbe czy ktoś mógłby poprawic ten kod lub podać mi inny sposob napisania takiego programu ?

O to kod :

#include <cstdlib>
#include <iostream>
using namespace std;

class wartosc
{
      private:
              int liczba;
              char napis[30];
    public:
////////////////////////////////////////////////
 void wprowadzLiczba(int li)
{
    liczba = li;
}
////////////////////////////////////////////////
void wprowadzNapis(const char* nap)
{
strncpy(napis,nap,30);
}
////////////////////////////////////////////////
    double pokazLiczba()
    {
    return liczba;
    }
////////////////////////////////////////////////
    char* pokazNapis()
    {
        return napis;
    }

////////////////////////////////////////////////
};

////////////////////////////////////////////////////////////////////////////////////////////////
class wartosc_double
{
      private:
              double liczba_d;
    public:
////////////////////////////////////////////////
void wprowadzLiczba(double li)
{
    liczba_d = li;
}
////////////////////////////////////////////////
    double pokazLiczba()
    {
    return liczba_d;
    }
////////////////////////////////////////////////
};

union moja_unia
{
    wartosc a;
    wartosc_double b;
};

class stos
{
////////////////////////////////////////////////
private:
        struct wezel

            {
            moja_unia dana;
            wezel *adres;
            };
////////////////////////////////////////////////
wezel *top;
public:
////////////////////////////////////////////////
    stos()
    {
        top = 0;
    }
////////////////////////////////////////////////
    ~stos()
    {
        empty();
    }
////////////////////////////////////////////////
    void push(moja_unia war_dana, int jaki_wyb)
    {
        wezel *e = new wezel;

if (jaki_wyb == 1)
{
        e->dana.a.wprowadzLiczba(war_dana.a.pokazLiczba());
        e->dana.a.wprowadzNapis(war_dana.a.pokazNapis());
}
        else if(jaki_wyb == 2)
{
        e->dana.b.wprowadzLiczba(war_dana.b.pokazLiczba());
}
        e->adres = top;
        top = e;
    }

    void pop()
    {
        wezel *e;
            {
                if(top == NULL) return;

                e = (top)->adres;
                delete top;
                top = e;
            }
    }

    void zawartosc(int jw)
    {
        wezel *e=top;

        while(e)
        {
            if (jw== 1)
            {
            cout<<"Liczba int : \n"<<e->dana.a.pokazLiczba()<<",\n ";
            cout<<"Napis : \n"<<e->dana.a.pokazNapis()<<",\n ";
            }
            else if(jw == 2)
            {
            cout<<"Liczba double : \n"<<e->dana.b.pokazLiczba()<<",\n ";
            }
            cout<<endl;
            e=e->adres;//4
        }
        cout<<endl;
    }

    void empty()

    {

        wezel *e;//pomocnicza

        if(top == NULL) return;

        while(top)

        {

            e = (top)->adres;

            delete top;

            top = e;

        }

    }

    bool IsEmpty()
    {
        if(top == NULL)

            return true;

        else

            return false;

    }

};

int main()
{
    stos st;
    char odp;
    int licz;
    double licz_d;
    char nap[30];
    moja_unia unia;

int wybor;
for (;;)
{
cout<<"1 int 2 double :\n";
cin>>wybor;
switch(wybor)
{
case 1:
    cout<<"Podaj dana int : "<<endl;
    cin>>licz;
    cout<<"Podaj napis : "<<endl;
    cin>>nap;
    break;

    unia.a.wprowadzLiczba(licz);
    unia.a.wprowadzNapis(nap);

case 2:
    cout<<"Podaj dana double : "<<endl;
    cin>>licz_d;
    break;

    unia.b.wprowadzLiczba(licz_d);
}

    st.push(unia,wybor);

    cout<<"Cczy koniec ?"<<endl;
    cin>>odp;
    if (odp == 't')
    break;

}
    cout<<endl;
    cout<<"To Twoj stos : \n\n";
    st.zawartosc(wybor);
    system("PAUSE");
    return EXIT_SUCCESS;
}
edytowany 2x, ostatnio: Adrian89, 2010-12-06 18:19

Pozostało 580 znaków

2010-12-06 17:52
Moderator

Rejestracja: 12 lat temu

Ostatnio: 5 godzin temu

Lokalizacja: Wrocław

0

Możesz poszukać czegoś o typie Variant (nie myle się ?), ale na początek zedytuj post, ponieważ ten kod wygląda porażająco.
Wklej go w <code class="cpp"> </code>


edytowany 2x, ostatnio: Patryk27, 2010-12-06 17:53

Pozostało 580 znaków

2010-12-06 18:38

Rejestracja: 9 lat temu

Ostatnio: 8 lat temu

0

Patryk27 poszukałem po internecie na temat typu VARIANT ale nic konkretnego nie znalazłem i nie wiem jak w ogóle tego użyć gdy zamieniłem :

    void push(VARIANT war_dana, int jaki_wyb)

wyskakuja bledy.
Czy moglbys mi podac jakis kokretny tego przyklad albo przerobic funkcje push ktora wczesniej napisalem bo poprostu poraz pierwszy sie z takim typem danych jak VARIANT spotkałem.

Pozostało 580 znaków

2010-12-06 19:16

Rejestracja: 10 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Redmond, WA

0

mozesz przechowywac typ void* i na stosie przechowywac wskazniki do obiektow, z tym ze musialbys wiedziec jaki typ znajduje sie aktualnie na stosie. aby sie tego dowiedziec mozesz np zrobic klase ktora to przechowuje:

#include <stack>
class klasaA
{
// costam
};
class klasaB
{
// costam
};
#define aaaklasaA 1
#define aaaklasaB 2
class dowolnaklasa
{
public:
  unsigned int ktoraklasa;
  void* wskazniknaobiekt;
  dowolnaklasa() {}
  dowolnaklasa(int klasa)
   {
    ktoraklasa = klasa;
    if (ktoraklasa==aaaklasaA)
       wskazniknaobiekt = void*(new klasaA);
    else  (ktoraklasa==aaaklasaB)
       wskazniknaobiekt = void*(new klasaB);
   }
  ~dowolnaklasa()
   {
    if (ktoraklasa==aaaklasaA)
       delete (klasaA*)(wskazniknaobiekt);
    else  (ktoraklasa==aaaklasaB)
       delete (klasaB*)(wskazniknaobiekt);
   }
};

int main()
{
  std::stack<dowolnaklasa> stos;
  stos.push_back(dowolnaklasa(aaaklasaA));
  stos.push_back(dowolnaklasa(aaaklasaB));

  return 0;
}

aaa zastap czymkolwiek, chodzi o to zeby nie powtarzala sie nazwa klasy
cos w tym stylu, nie kompilowalem wiec moga byc bledy

a tak pozatym to slabo szukales tego typu variant:
http://www.boost.org/doc/libs/1_45_0/doc/html/variant.html


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 3x, ostatnio: krwq, 2010-12-06 19:20

Pozostało 580 znaków

2010-12-06 19:47

Rejestracja: 9 lat temu

Ostatnio: 8 lat temu

0

Aha no oki dzięki wielkie!

Pozostało 580 znaków

icek_
2010-12-06 20:32
icek_
0

Zaproponuje jeszcze http://www.boost.org/doc/libs/1_45_0/doc/html/any.html jako alternatywe.

Pozostało 580 znaków

nobody
2010-12-08 11:45
nobody
0

co do VARIANT to jest to proste jak konstrukcja cepa, idea jest taka:

enum VARIANT_TYPES {
  vtUnknwon = 0,
  vtByte,
  vtWord,
  vtDword,
  vtQword,
  vtFloat,
  vtDouble
  //etc
};

struct VARIANT {
  VARIANT_TYPES vt; //określa w jakim polu unii wpisana jest wartość (jaki ma format)
  union {
    char Byte;
    short Word;
    long Dword;
    long long Qword;
    float Float;
    double Double;
  };
};

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0