E S - uniwersum struktury stosu



Podobne dokumenty
Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Temat: Dynamiczne liniowe struktury danych - stos, kolejka, lista. 1. Wady i zalety struktury tablicy

Temat: Struktury danych do reprezentacji grafów. Wybrane algorytmy grafowe.

KOLEJKA (QUEUE) (lista fifo first in, first out)

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Dynamiczne struktury danych

Etap 2 - Budowa interfejsu. typedef struct ELEMENT* stos; struct ELEMENT { dane Dane; stos Nastepny; }; struct kolejka { stos Poczatek, Koniec; };

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Systemy algebraiczne. Materiały pomocnicze do wykładu. przedmiot: Matematyka Dyskretna 1 wykładowca: dr Magdalena Kacprzak

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Strategia "dziel i zwyciężaj"

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Wybrane algorytmy tablicowe

Algorytmy i Struktury Danych.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Algorytmy i Struktury Danych. Anna Paszyńska

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Struktury dynamiczne

Struktury. Przykład W8_1

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Algorytmy i Struktury Danych

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Struktury danych: stos, kolejka, lista, drzewo

Podstawy Kompilatorów

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Programowanie i struktury danych 1 / 44

Funkcja (podprogram) void

Wskaźniki. Programowanie Proceduralne 1

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Wstęp do Programowania, laboratorium 02

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

dr inż. Paweł Myszkowski Wykład nr 11 ( )

. Podstawy Programowania 2. Dwukierunkowa lista liniowa. Arkadiusz Chrobot. 7 kwietnia 2019

Abstrakcyjne struktury danych w praktyce

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Podstawy programowania skrót z wykładów:

1 Podstawy c++ w pigułce.

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Tablice, funkcje - wprowadzenie

Wstęp do programowania

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

tablica: dane_liczbowe

2 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

ŁAŃCUCHY W JĘZYKU C/C++

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Podstawy informatyki 2

Podstawy programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Programowanie obiektowe

Podstawy Programowania C++

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Ćwiczenie 5 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Zmienne, stałe i operatory

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Algorytm selekcji Hoare a. Łukasz Miemus


Języki programowania obiektowego Nieobiektowe elementy języka C++

Marcin Matusiak i Łukasz Stasiak

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

1 Podstawy c++ w pigułce.

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

1. Kalkulator czterech działań. 2. Konwersja ciągu znaków do tablicy.

Programowanie strukturalne i obiektowe

Wykłady opracowane zostały w oparciu o materiały prof. dr hab. Jerzego Weresa. Poznań 2009/2010 Algorytmy i struktury danych Krzysztof Nowakowski 2

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Jerzy Nawrocki, Wprowadzenie do informatyki

Programowanie w VB Proste algorytmy sortowania

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

DYNAMICZNE PRZYDZIELANIE PAMIECI

Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

. Podstawy Programowania 2. Jednokierunkowa lista liniowa. Arkadiusz Chrobot. 28 marca 2017

Podstawy Programowania 2 Jednokierunkowa lista liniowa. Plan. Jednokierunkowa lista liniowa. Jednokierunkowa lista liniowa. Notatki. Notatki.

Transkrypt:

Temat: Struktura stosu i kolejki Struktura danych to system relacyjny r I r i i I U,, gdzie U to uniwersum systemu, a i i - zbiór relacji (operacji na strukturze danych). Uniwersum systemu to zbiór typów parametrów wszystkich operacji zbioru r i i I. 1. Definicja struktury stosu System relacyjny E S, push, pop, E S - uniwersum struktury stosu top, empty E niepusty zbiór elementów (możliwych danych, które chcemy zapamiętać w stosie ) S niepusty zbiór zwany zbiorem stosów Sygnatura systemu (parametry i wyniki operacji) push : S E S pop : S S top : S E : S 0,1 empty ( 0 fałsz, 1 - prawda) 1

Specyfikacja (własności) operacji stosu e E, s S Zakładamy, że : 1. Operacja empty(s) zwraca wartość 1, gdy stos jest pusty, a 0 w przypadku przeciwnym. 2. Operacja pop(s) usuwa element, który znajduje się w wierzchołku stosu ( najpóźniej wstawiony do stosu). Jeżeli przed wywołaniem operacji pop(s) stos s był pusty, to operacja pop(s) nie zmienia stosu s. 3. Operacja push(s, e) wstawia element e w wierzchołku stosu. 4. Operacja top(s) zwraca element znajdujący się aktualnie w wierzchołku stosu s. Jeżeli przed wywołaniem top(s) stos s był pusty, to wartość operacji top(s) jest nieokreślona. 2. Przykładowe implementacje struktury stosu a) Implementacja wskaźnikowa struct typ_danych ; // deklaracja pól struktury danych struct pod_adresem typ_danych dane; pod_adresem * nastepny; ; W dalszych rozważaniach będziemy zakładali, że w strukturze danych (stosie lub kolejce ) będą zapamiętane liczby całkowite nieujemne (typu unsigned). Czyli typ_danych=unsigned. 2

Operacja push - wstawiania do stosu void push(pod_adresem **w, typ_danych d) pod_adresem *w; // zmienna reprezentująca wierzchołek // stosu Przed wywołaniem push(&w,d) w 16 dane nastepny Po wywołaniu push(&w,d) w d 20 16 20 void push(pod_adresem **w, typ_danych d) pod_adresem *temp; temp=*w; *w=(pod_adresem *)malloc(sizeof(pod_adresem)); (*w)->dane=d; (*w)->nastepny=temp; 3

Operacja pop - usuwania ze stosu void pop(pod_adresem **w) Przed wywołaniem pop(&w) Po wywołaniu pop(&w) w 16 dane w 20 nastepny 20 void pop(pod_adresem **w) pod_adresem *temp; if ((*w)!=) temp=(*w)->nastepny;; free(*w); *w=temp; Operacja empty - sprawdzania, czy stos jest pusty short empty(pod_adresem *w) return (w==); 4

Operacja top ustalania danych, które znajdują się w wierzchołku stosu Uwaga!!! Operacja top powinna być wywoływana tylko w sytuacji, gdy stos jest niepusty typ_danych top(pod_adresem *w) if (w!=) return w->dane; Operacja empty - sprawdzania, czy stos jest pusty short empty(pod_adresem *w) return (w==); Przykład 1 unsigned d; pod_adresem *w=; for (int i=1;i<=10;i++) push(&w,i); for (int i=1;i<=10;i++) d=top(w); pop(&w); printf("%d ",d); b) Implementacja tablicowa W indeksie 0 tablicy w znajduje się indeks wierzchołka stosu. Jeżeli stos jest pusty, to w[0]=0 Uwaga!!! W stosie w nie może się znaleźć jednocześnie więcej niż n elementów. 5

unsigned top(typ_danych *w) if (w[0]!=0) return w[w[0]]; short empty(typ_danych *w) if (w[0]==0) return 1; else return 0; void push(typ_danych *w, typ_danych e) w[0]=w[0]+1; w[w[0]]=e; void pop(typ_danych *w) if (w[0]>0) w[0]=w[0]-1; Przykład 2 a) stos pusty: empty(w)=1, top(w) wartość nieokreślona, pop(w) nie zmienia stosu w: 0 0 1 2 3 4 5 6 7 9 b) push(w, 4) w: 1 4 0 1 2 3 4 5 6 7 9 c) push(w, 2) w: 2 4 2 0 1 2 3 4 5 6 7 9 top(w)=2, empty(w)=0 6

d) pop(w) w: 1 4 0 1 2 3 4 5 6 7 9 top(w)=4, empty(w)=0 Przykład 3 unsigned d; unsigned w[0]; w[0]=0; for (int i=1;i<=10;i++) push(w,i); for (int i=1;i<=10;i++) d=top(w); pop(w); printf("%d ",d); Prosty przykład zastosowania struktury stosu Wyświetlić ciąg podanych przez użytkownika znaków w rewersie. Ciąg jest zakończony znakiem #13. Algorytm 1 (rekurencja) void reverse() char ch; scanf( %c,&ch); if (ch!=10) reverse(); printf( %c,ch); 7

Algorytm 2 (stos jawny) void iter_reverse() char ch; s= ; Inicjalizacja stosu do scanf( %c,&ch); push(s, ch); while (ch! =10); while (!empty(s)) ch=top(s); printf( %c,ch); pop(s); 2. Definicja struktury kolejki System relacyjny E Q, in, out, first, empty E niepusty zbiór elementów (możliwych danych) Q niepusty zbiór zwany zbiorem kolejek Sygnatura systemu (parametry i wyniki operacji) in : Q E Q out : Q Q first : Q E empty : Q 0, 1

Specyfikacja (własności) e E, q Q Zakładamy, że : 1. Operacja empty(q) zwraca wartość 1, gdy kolejka jest pusta, a 0 w przypadku przeciwnym. 2. Operacja out(s) usuwa element, który znajduje się na początku kolejki ( najwcześniej wstawiony do kolejki). Jeżeli przed wywołaniem operacji out(q) kolejka q była pusta, to operacja out(q) nie zmienia kolejki q. 3. Operacja in(q, e) wstawia element e na koniec kolejki q. 4. Operacja first(q) zwraca element znajdujący się aktualnie na początku kolejki q. Jeżeli przed wywołaniem first(q) kolejka q była pusta, to wartość operacji first(q) jest nieokreślona. 4. Implementacja wskaźnikowa struct typ_danych ; // deklaracja pól struktury danych struct pod_adresem typ_danych dane; pod_adresem * nastepny; ; struct kolejka pod_adresem * koniec, *poczatek; ; 9

a) Operacja in - wstawiania do kolejki void in(kolejka *q, typ_danych d) kolejka q; // struktura zapamiętująca adres początku i końca kolejki Przed wywołaniem in(&q,d) poczatek 16 dane nastepny Po wywołaniu in(&q,d) poczatek 16 20 20 koniec koniec d void in(kolejka *q, typ_danych d) pod_adresem *temp; temp=q->koniec; q->koniec=(pod_adresem *)malloc(sizeof(pod_adresem)); q->koniec->dane=d; q->koniec->nastepny=; if (temp!=) temp->nastepny=q->koniec; else q->poczatek=q->koniec; 10

b) Operacja out usuwiania z kolejki void out(kolejka *q); Przed wywołaniem out(&q) poczatek 16 dane nastepny Po wywołaniu out(&q) poczatek 20 20 koniec koniec void out(kolejka *q) pod_adresem *temp; if (q->poczatek!=) temp=q->poczatek->nastepny; free(q->poczatek); q->poczatek=temp; Operacja first ustalania danych, które znajdują się na początku kolejki Uwaga!!! Operacja first powinna być wywoływana tylko w sytuacji, gdy kolejka jest niepusta 11

typ_danych first(kolejka q) if (q.poczatek!=) return q.poczatek->dane; Operacja empty - sprawdzania, czy kolejka jest pusta short empty(kolejka q) return (q.poczatek==); Przykład 5 kolejka q; q.poczatek=;q.koniec=; for (int i=1;i<=10;i++) in(&q,i); for (int i=1;i<=10;i++) d=first(q); out(&q); printf("%d ",d); Przykłady zastosowania struktury kolejki - sito Eratostenesa Algorytm generowania wszystkich liczb pierwszych nie większych niż n. Idea 1. Tworzymy kolejkę p wszystkich liczb większych równych 2 i mniejszych bądź równych od n. 2. Ustalamy liczbę s = first(p). 12

3. Usuwamy z kolejki p pierwszy element i wstawiamy go do kolejki wynikowej w. 4. Usuwamy z kolejki p pozostałe elementy i wstawiamy je do kolejki pomocniczej q, pod warunkiem, że nie dzielą się przez s. 5. Zamieniamy kolejki p i q. 6. Kroki 2, 3, 4, 5 powtarzamy, aż do momentu, gdy kolejka p będzie pusta. 7. Wynik, czyli liczby pierwsze mniejsze bądź równe n znajdują się w kolejce w. Przykład 6 n=15 1. p: 2, 3, 4, 5, 6, 7,, 9, 10, 11, 12, 13, 14, 15 q: w: 2. p: 3, 4, 5, 6, 7,, 9, 10, 11, 12, 13, 14, 15 q: w: 2 3. p: q: 3, 5, 7, 9, 11, 13, 15 w: 2 4. p: 3, 5, 7, 9, 11, 13, 15 q: w: 2 5. itd. p: q: 5, 7, 11, 13 w: 2, 3 13

p: 5, 7, 11, 13 q: w: 2, 3 p: q: 7, 11, 13 w: 2, 3, 5... Ostatecznie: p: q: w: 2, 3, 5, 7, 11, 13 Algorytm sita Eratostenesa p= ; q= ; w= ; for (i=2; i<=n; i++) in(p, i); while (!empty(p)) s=first(p); in(w, s); while (!empty(p)) d=first(p); if (d% s!=0) in(q, d); p:=:q; zamiana kolejek p and q 14