Szablon klasy i dynamiczna alokacja elementów

0

Witam, mam następujący problem do zrealizowania:

Napisac kod szablonu klasy template <typename T> stos (wykorzystując dynamiczną alokację pamięci do przechowywania elementów stosu) z dostępnymi następującymi metodami.

  1. konstruktor(n) - n rozmiar stosu
  2. destruktor
  3. push - włożenie elementu na stos
  4. pop - pobranie elementu z stosu
  5. show - wyświetlenie zawartości stosu
    Napisać program potwierdzający poprawne działanie stworzonego wzorca (poprzez wywołanie wszystkich dostępnych metod) dla dwóch różnych wartości parametrów wzorca (np. string i float).

Dodatkowo zastosować mechanizm generowania i obsługi wyjątków w dwóch następujących sytuacjach:

  1. wartość parametru przekazana do konstruktora jest ujemna
  2. próba wywołania metody push w przypadku całkowitego zapełnienia stosu

W jaki sposób powinienem tu wykonywać dynamiczną alokację pamięci?
Czy ten stos to w tym przypadku tablica wskaźników?
Czy działanie tego jest na zasadzie, że dostęp mam tylko do ostatniego elementu 'dodanego' do stosu?

0
  1. Chyba o to chodzi, abyś w konstruktorze alokował pamięć.
  2. W tym wypadku może to być tablica
  3. Tak
0

generalnie jak masz stos, to alokujesz tak:
Typ* stos = new Typ[rozmiar];

usuwasz tak:
`delete [] stos;

tak inicjalizujesz:
Typ* current = stos; // current powinno byc skladowa klasy

tak dodajesz element:
*current++ = element;

tak patrzysz na ostatni:
ostatni = *(current-1);

tak usuwasz:
--current;

to jest tylko przykładowa implementacja, ale chyba jednocześnie najprostsza

dodatkowo sprawdzasz w międzyczasie czy nie wychodzisz gdzieś poza zakres i jeśli tak to rzucasz wyjątkiem albo nic nie robisz i zakladasz ze ktos bedzie poprawnie uzywal

0
krwq napisał(a):

tak inicjalizujesz:
Typ* current = stos; // current powinno byc skladowa klasy

tak dodajesz element:
*current++ = element;

tak patrzysz na ostatni:
ostatni = *current;

Jeżeli dodajesz tak jak piszesz to na pewno nie tak patrzysz na ostatni jak piszesz i vice versa.
lepiej:
Typ *Tb,*End,*Cur;

konstruktor: Tb=new Typ[Rozmiar]; End=Tb+Rozmiar-1; Cur=Tb-1;
push: if(Cur<End) *(++Cur) = wartosc; else throw ...
pop: if(Cur>=Tb) return *(Cur--); else throw ...
peek: if(Cur>=Tb) return *Cur; else throw ...
destruktor: delete[] Tb;
Pamiętaj też o konieczności konstruktora kopiującego oraz implementacji operatora przypisania.

0

Dziękuję wszystkim za odpowiedzi, dzięki Wam już to napisałem i ładnie śmiga.

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