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