STOS::
Wyobraźcie sobie, że uczestniczycie w większym projekcie. Waszym zadaniem jest zaimplementowanie klasy obsługującej stos liczb zmiennoprzecinkowych według ściśle podanych wytycznych:
1. Klasa nazywa się "Stack"
2. Klasa Stack posiada konstruktor jednoargumentowy określający rozmiar stosu
3. Dane stosu są przechowywane w dynamicznie alokowanej tablicy o nazwie "buffer"
4. Klasa posiada dwie metody dostępu do danych:
a) push() - umieszcza wartość na wierzchołku stosu
Metoda push ma jeden parametr - liczbę typu double. Zwraca prawdę lub fałsz, w zależności od tego czy operacja się powiodła czy nie.
Prototyp:
bool push(double v)
b) pop() - pobiera wartość z wierzchołka stosu
Ze względu na wygodę użytkownika zdecydowano, że metoda pop ma mieć dwie wersje - z przekazywaniem wartości przez wskaźnik i przez referencję. Metoda zwraca prawdę jeśli operacja się powiodła, fałsz w przeciwnym wypadku.
Prototypy:
bool pop(double *v);
bool pop(double &v);
Daje Wam to następujący szkielet klasy:
class Stack {
double *buffer;
public:
Stack(int size);
bool push(double v);
bool pop(double *v);
bool pop(double &v);
~Stack() {if (buffer) delete [] buffer;}
};
Waszym zadaniem jest zaimplementowanie stosu według podanych wyżej wytycznych. Jako rozwiązanie proszę przesłać spakowany projekt zawierający pliki:
- Stack.h
- Stack.cpp
- main.cpp
W pliku main.cpp należy zademonstrować działanie stosu:
1. Tworzenie nowego stosu
2. Umieszczanie 3 wartości na stosie i następnie ich pobranie i wyświetlenie
3. Weryfikację zabezpieczeń - co się stanie jeśli spróbujecie pobrać wartość z pustego stosu lub umieścić wartość na stosie całkowicie zapełnionym
LISTA:
Waszym zadaniem jest stworzenie klasy, która stanie się częścią większego systemu. Klasa ma służyć do przechowywania dużej ilości elementów typu "Element". Z punktu widzenia tego zadania klasę "Element" możemy sobie uprościć do kodu podanego poniżej:
class Element {
int val;
public:
Element (int v=0) {val=v;}
int getVal() {return val;}
};
Na sposób implementacji Waszej klasy narzucono szereg ograniczeń:
1. Klasa ma nazywać się "LinkedList"
2. Dane mają być przechowywane jako lista dwukierunkowa
3. Elementy listy indeksowane są od 0
4. Klasa ma posiadać następujące metody publiczne:
int size();
// Zwraca liczbę elementów na liście. Czas działania tej operacji nie może zależeć
// od liczby elementów na liście
Element * get(int index);
// Zwraca wskaźnik na element leżący na pozycji "index" lub NULL
// jeśli index jest nieprawidłowy. Za nieprawidłowe uznajemy indeksy:
// - mniejsze od zera
// - większe niż size()-1
Element * set(int index, E * element);
// Zastępuje element leżący na pozycji index elementem przekazanym jako
// parametr wywołania. Zwraca wskaźnik na wstawiony element lub NULL jeśli
// operacja nie mogła być wykonana poprawnie
bool add(E * element);
// Dodaje element przekazany jako parametr wywołania na koniec listy
// Zwraca prawdę jeśli operacja się udała, fałsz jeśli z jakiegokolwiek powodu
// nie mogła być wykonana
bool add(int index, E * element);
// Dodaje element do listy w taki sposób, aby znalazł się on na pozycji "index".
// Jeśli na tej pozycji już był jakiś element, to nowo wstawiony element musi
// znaleźć się przed elementem istniejącym. Przypadki szczególne:
// index <= 0 - element jest wstawiany na początek listy
// index >= size() - element jest wstawiany na koniec listy
// zwraca prawdę jeśli operacja się powiodła
bool remove(int index);
// Usuwa z listy element leżący na pozycji index. Zwraca prawdę jeśli operacja się
// udała, fałsz w przeciwnym wypadku.
5. Metody które kasują elementy są odpowiedzialne za zwolnienie ich pamięci
Powyższe ograniczenia narzucają poniższy szkielet klasy LinkedList:
class LinkedList {
public:
int size();
Element * get(int index);
Element * set(int index, E * element);
bool add(E * element);
bool add(int index, E * element);
bool remove(int index);
};
Waszym zadaniem jest uzupełnienie go tak, aby spełnione były podane wyżej założenia.
Jako rozwiązanie proszę przesłać spakowany projekt zawierający pliki
- LinkedList.h
- LinkedList.cpp
- Element.h
- main.cpp
W pliku main.cpp należy zademonstrować działanie wszystkich metod listy.
Uwaga - proszę zwrócić uwagę na przypadki szczególne, np.
- dodawanie elementu na koniec pustej listy
- kasowanie ostatniego elementu listy