• Nie Znaleziono Wyników

Wstęp do programowania Stosy i kolejki

N/A
N/A
Protected

Academic year: 2021

Share "Wstęp do programowania Stosy i kolejki"

Copied!
27
0
0

Pełen tekst

(1)

© Piotr Chrząstowski-Wachtel

Wstęp do programowania

Stosy i kolejki

(2)

2

Stosy

Stosy elementów ze zbioru A, to struktury danych, które umożliwiają wykonanie następujących

operacji i funkcji {var x:typA; s:stack of typA}:

Empty(s) czy stos s jest pusty?

Init(s) utwórz pusty stos s

Push(s,x) włóż na stos s wartość x

Pop(s,x) zdejmij ze stosu s element i przypisz go x

====================================

Top(s,x) podaj wartość x na szczycie stosu s

Full(s) czy stos s jest pełny?

Clear(s) wyczyść stos s

(3)

3

Kolejki

Kolejki elementów ze zbioru A, to struktury danych, które umożliwiają wykonanie następujących operacji i funkcji {var x:typA; k:kolejka of typA}:

Pusta(k) czy kolejka k jest pusta?

TwórzPustą(k) utwórz pustą kolejkę k

Wstaw(k,x) włóż do kolejki k wartość x

Pobierz(k,x) usuń z kolejki k element i przypisz go x

=======================================

Pierwszy(k,x) podaj wartość x na początku kolejki k

Pełna(k) czy kolejka k jest pełna?

Usuń(k) wyczyść kolejkę k

(4)

4

Implementacja tablicowa stosu

Type stackA = record

T :array[1..n] of typA;

top:Integer end;

Zakładamy, że stos ma co najwyżej n elementów typu A przechowywanych w tablicy T oraz że top jest indeksem pierwszego wolnego miejsca w

tablicy na kolejny element.

(5)

5

Implementacja tablicowa stosu

function Empty(const S:stackA):Boolean;

begin

Empty:= S.top=1 end;

procedure Init(var S:stackA);

begin

S.top:=1 end;

(6)

6

Implementacja tablicowa stosu

procedure Push(var S:stackA; x:typA);

begin

S.T[S.top]:=x;

Inc(S.top) end;

procedure Pop(var S:stackA; var x:typA);

begin

Dec[S.top];

x:=S.T[S.top]

end;

(7)

7

Implementacja tablicowa stosu

procedure Top(const S:stackA; var x:typA);

begin

x:=S.T[S.top-1]

end;

function Full(const S:stackA):Boolean;

begin Full:=S.top>n end;

procedure Clear(var S:stackA);

begin S.top:=1 end; {to samo co Init}

(8)

8

Dwa stosy w jednej tablicy

Często stosujemy implementację dwóch stosów w jednej tablicy: można je oddzielnie przechowywać z obu końców (procedury wstawiania i usuwania są dualne). Procedura

Pełny wymaga porównania obu wskażników wierzchołka stosu.

(9)

9

Implementacja listowa stosu

type typA=Integer;

stackA=listaA;

listaA=^record w:typA;

nast:listaA end;

...czyli zwykła lista elementów typu typA.

(10)

10

Implementacja listowa stosu

function Empty(const S:stackA):Boolean;

begin

Empty:= S=nil end;

procedure Init(var S:stackA);

begin

S:=nil end;

(11)

11

Implementacja listowa stosu

procedure Push(var S:stackA; x:typA);

var pom:stackA;

begin

new(pom);

pom^.nast:=S;

pom^.w:=x;

S:=pom end;

{Dodajemy nowy element na początku listy}

(12)

12

Implementacja listowa stosu

procedure Pop(var S:stackA; var x:typA);

var pom:stackA;

begin

pom:=S;

x:=S^.w;

S:=S^.nast;

dispose(pom) end;

{Usuwamy pierwszy element listy}

(13)

13

Implementacja listowa stosu

procedure Top(var S:stackA; x:typA);

begin

x:=S^.w end;

function Full(const S:stackA):Boolean;

begin

Full:=MaxAvail < sizeof(stackA^) end;

(14)

14

Implementacja listowa stosu

procedure Clear(var S:stackA);

var dummy:typA;

begin

while not Empty(S) do Pop(S,dummy)

end;

(15)

15

Implementacja tablicowa kolejki

Type kolejkaA = record

T :array[0..n] of typA;

pocz,kon:Integer end;

Zakładamy, że kolejka ma co najwyżej n elementów typu A przechowywanych w tablicy T. Indeksy pocz i kon odpowiadają odpowiednio pierwszemu

elementowi w kolejce oraz pierwszemu wolnemu miejscu w tablicy na kolejny element.

(16)

16

Implementacja tablicowa kolejki

Kolejka w tablicy

pocz kon

8 54 15 12

(17)

17

Implementacja tablicowa kolejki

Użyteczna funkcja:

function Next(j:Integer):Integer;

begin

if j=n then Next:=0 else Next:=j+1

end;

{lub j:=j mod n + 1, co jest może i zgrabniejsze, ale droższe niż „if”}

(18)

18

Implementacja tablicowa kolejki

function Pusta(const k:kolejkaA):Boolean;

begin

Empty:= k.pocz=k.kon end;

procedure TwórzPustą(var k:kolejkaA);

begin

k.pocz:=0; k.kon:=0;

end;

(19)

19

Implementacja tablicowa kolejki

procedure Wstaw(var k:kolejkaA; x:typA);

begin

k.T[k.kon]:=x;

k.kon:=Next(k.kon) end;

procedure Pobierz(var k:kolejkaA; var x:typA);

begin

x:=k.T[k.pocz];

k.pocz:=Next(k.pocz)

(20)

20

Implementacja tablicowa kolejki

procedure Pierwszy(const k:kolejkaA;

var x:typA);

begin

x:=k.T[k.pocz]

end;

function Pełna(const k:kolejkaA):Boolean;

begin Pełna := k.pocz=Next(k.kon) end;

procedure Usuń(var k:kolejkaA);

begin k.kon:=k.pocz end;

(21)

21

Implementacja listowa kolejki

type kolejkaA=record pocz,kon:listaA;

pocz kon

55 44 33 72

k

(22)

22

Implementacja listowa kolejki

function Pusta(const k:kolejkaA):Boolean;

begin

Empty:= k.pocz=nil end;

procedure TwórzPustą(var k:kolejkaA);

begin

k.pocz:=nil;

end;

(23)

23

Implementacja listowa kolejki

procedure Wstaw(var k:kolejkaA; x:typA);

begin

if k.pocz=nil then begin new(k.pocz);

k.pocz^.w:=x;

k.kon:=k.pocz end

else begin

WstawZa(x,k.kon);

k.kon:=k.kon^.nast end

(24)

24

Implementacja listowa kolejki

procedure Pobierz(var k:kolejkaA;

var x:typA);

var pom:listaA;

begin

x:=k.pocz^.w;

pom:=k.pocz;

if k.pocz=k.kon then k.pocz:=nil

else k.pocz:=k.pocz^.nast;

dispose(pom) end;

(25)

25

Implementacja listowa kolejki

procedure Pierwszy(const k:kolejkaA;

var x:typA);

begin

x:=k.pocz^.w end;

function Pełna(const k:kolejkaA):Boolean;

begin

Pełna := MaxAvail < `sizeof(listaA^) end;

(26)

26

Implementacja listowa kolejki

procedure Clear(var k:kolejkaA);

var dowol:typA;

begin

while not Pusta(k) do Pobierz(k,dowol) end;

(27)

27

Implementacja listowa kolejki

Można kolejkę ładnie zaimplementować w liście cyklicznej.

Wtedy wskaźnik do listy jest ostatnim elementem kolejki.

Wstawiamy za niego, modyfikując go, a pierwszy element jest zawsze następnikiem tego wskaźnika.

Cytaty

Powiązane dokumenty

Zdefiniujemy teraz specjalne osobliwości zwane minimalnymi osobli-

Pokaż przebieg algorytmów wyszukiwania sekwencyjnego (indeks), binarnego z powtórzeniami (kolejne przedziały) oraz bez powtórzeń (kolejne przedziały) przy

Funkcja moŜe otrzymać przez listę parametrów tablice oraz liczbę elementów, natomiast powinna zwracać przez wynik.. (return) nowa

Pokazać, że jeśli A nie jest samosprzężony na H, to równość kAk =

Pokazać, że każdy operator śladowy jest iloczynem dwu operatorów

Każda reszta modulo n ma wielu reprezentantów, na przykład reszta 1 modu- lo 5 jest reprezentowana przez każdą z liczb 1, 6, −19, 11,.. W przeciwnym przypadku, a nazywamy

Uruchom program, sprawdź efekt podania wartości, która nie występuje w tablicy, wartości występującej w tablicy oraz efekt niepoprawnego podania liczby.. catch z

powyżej podwójnej pętli for, w której tworzymy tablicę w, zadeklaruj trzy zmienne całkowite ld , lu, lz, które posłużą jako liczniki dodatnich, ujemnych i zerowych