wykład xiv

Transkrypt

wykład xiv
Stos
LIFO – Last In First Out
Operacje:
push - dodanie elementu na stos
pop - usunięcie elementu ze stosu
empty - sprawdzenie, czy stos jest pusty
size - zwrócenie liczby elementów na stosie
value (peek) - zwrócenie ostatniego elementu na stosie
Implementacja tablicowa:
int dane[6];
int rozmiar;
void push()
{
if (rozmiar>=5)
{
cout << "Stos pelny!";
}
else
{
cout<<endl<< "PUSH (jaka liczbe polozyc na stosie): ";
rozmiar=rozmiar+1;
cin>>dane[rozmiar];
}
}
void pop()
{
if (rozmiar>=1)
{
cout<<endl<<"POP
"<<dane[rozmiar];
-
nastapi
usuniecie
ze
rozmiar=rozmiar-1;
}
else
{
cout << "Stos pusty!";
}
}
void size()
{
cout<<endl<<"Liczba elementow na stosie: "<<rozmiar;
}
void empty()
{
stosu
liczby:
if (rozmiar==0) cout<<endl<<"stos
jest pusty";
else cout<<endl<<"stos nie jest pusty";
}
Implementacja na zmiennych dynamicznych:
…
Kolejka
FIFO – First In First Out
Operacje:
push_back (add, add_to_queue, enqueue ) - dodanie elementu na koniec kolejki
pop_back – (remove_from_queue, dequeue) usunięcie "obsłużenie" elementu z początku kolejki
size - liczba elementów w kolejce
first - wartość pierwszego elementu w kolejce
last - wartość ostatniego elementu w kolejce
Implementacja tablicowa:
int dane[5];
int ile;
int glowa;
int ogon;
void push()
{
if (ile>=5)
{
cout << "Kolejka pelna!";
}
else if (ile==0)
{
cout<<endl<< "PUSH (jaka liczbe wstawic do kolejki): ";
cin>>dane[ogon];
ogon=ogon+1;
ile=ile+1;
}
else
{
cout<<endl<< "PUSH (jaka liczbe wstawic do kolejki): ";
cin>>dane[ogon];
ogon=(ogon+1)%5;
ile=ile+1;
}
}
void pop()
{
if (ile==0)
{
cout<<"Kolejka jest pusta!";
Sleep(2000);
}
else
{
cout<<endl<<"POP
"<<dane[glowa];
-
nastapi
usuniecie
glowa=(glowa+1)%5;
ile=ile-1;
}
}
void size()
{
cout<<endl<<"Liczba elementow w kolejce: "<<ile;
}
void empty()
{
if (ile==0) cout<<endl<<" kolejka jest pusta ";
else cout<<endl<<" kolejka nie jest pusta ";
Sleep(2000);
}
Implementacja na zmiennych dynamicznych:
ZADANIE DOMOWE DLA CHĘTNYCH !
z
kolejki
liczby:
Lista
Operacje:
push_front – dodanie na początek
push_back – dodanie na koniec
pop_front – pobranie z początku
pop_back – pobranie z końca
size – rozmiar
empty – sprawdzenie, czy nie jest pusta
remove – usunięcie elementu (z początku, końca lub o podanym numerze)
dodatkowo:
sort - sortowanie
reverse – “odwrócenie”
set – ustawienie wartości elementu o podanym numerze
add – dodanie elementu po pozycji o danym numerze
Implementacja praktycznie we wszystkich językach (STL::list w C++ , ArrayList
w Java.utils)
Sterta(Kopiec)
Kopiec inaczej zwany stogiem jest szczególnym przypadkiem drzewa binarnego, które spełnia tzw.
warunek kopca tzn. każdy następnik jest niewiększy od swego poprzednika. Z warunku tego wynikają
szczególne własności kopca:
w korzeniu kopca znajduje się największy lub jeden z grupy największych o identycznej wartości, na
ścieżkach (połączeniach między węzłami), od korzenia do liścia, elementy są posortowane nierosnąco
Kopiec zupełny – to kopiec będący zupełnym drzewem binarnym. Drzewo binarne jest zupełne wtedy
gdy wszystkie poziomy z wyjątkiem ostatniego są całkowicie zapełnione a na ostatnim liście są spójnie
ułożone od strony lewej do prawej.
Sortownie przez kopiec:
#define maxHeapSize 50
using namespace std;
int heap[maxHeapSize],heapSize;
void insert(int element)
{
heap[heapSize] = element;
int i = heapSize;
while(heap[(i+1)/2-1] < element && i>0){
heap[i] = heap[(i+1)/2-1];
i = (i+1)/2-1;
}
heap[i] = element;
}
void heapify (int i)
{
int largest;
int l=2*(i+1)-1, r=(2*i)+2;
if (l<heapSize && heap[l]>heap[i])largest=l;
else largest=i;
if (r<heapSize && heap[r]>heap[largest])largest=r;
if (largest!=i){
swap(heap[largest],heap[i]);
heapify(largest);
}
}
int main(){
ifstream
2017_zimowy\\PWR\\c\\w10\\dane.csv");
dane("d:\\andrzej\\Dydaktyka\\2016-
string wiersz;
while(getline(dane,wiersz)){
cout<<wiersz<<endl;
string s;
stringstream ss(wiersz);
while(getline(ss,s,';')){
cout<<s<<endl;
if(heapSize==0){
heap[0]=atoi(s.c_str());
}
else{
insert(atoi(s.c_str()));
}
heapSize++;
}
}
int end=1;
cout<<"DRUKUJĘ KOPIEC"<<endl;
for(int i=0;i<4;i++){
for(int j=end-1;j<2*end-1;j++){
cout<<heap[j]<<" ; ";
}
cout<<endl;
end*=2;
}
cout<<"Długość: "<<heapSize<<endl;
int number_of_elements=heapSize;
for (int i=heapSize-1;i>0;i--)
{
swap(heap[i],heap[0]);
heapSize--;
heapify(0);
}
cout<<"Liczby Posortowane: ";
for(int i= 0;i< number_of_elements;i++)
{
cout<<heap[i]<<" ";
}
return 0;
}
Tablica asocjacyjna
Tablica asocjacyjna jest nazywana także tablicą skojarzeniową. Przechowuje ona dane parami, każdej
wartości przyporządkowuje odpowiedni klucz. Aby uzyskać dostęp do danej wartości trzeba znać nazwę
jej klucza.
Najpopularniejsza implementacja : tablica mieszająca, („haszująca”) , mapa mieszająca
Najpopularniejsze implementacje:
STL (C++) – klasa map
Java – klasa HashMap