Ćwiczenie laboratoryjne Oprogramowanie i badanie stosu lub kolejki w środowisku Visual Basic 2005 Tematy ćwiczenia realizacja stosu lub kolejki dla tablicowej lub listowej reprezentacji. operacje na stosie lub kolejce. Zadanie polega na oprogramowaniu stosu lub kolejki dla tablicowej lub listowej reprezentacji. Program musi przyjmować rozmiar stosu lub kolejki, wyświetlać zawartość stosu lub kolejki oraz element na wierzchu stosu lub elementy na początku i końcu kolejki, przyjmować i odkładać na stos lub zapisywać do kolejki nowy element, zdejmować element ze stosu lub odczytywać element z kolejki, komunikować o przepełnieniu stosu lub kolejki i o tym, że stos lub kolejka jest pusta. Warianty operacji Wariant Rodzaj Struktura Indeks Wariant Rodzaj struktury Struktura bazowa struktury bazowa stosu 1 stos tablica od -1 17 kolejka tablica 2 stos lista 18 kolejka lista 3 stos tablica od 0 19 kolejka tablica 4 stos lista 20 kolejka lista 5 stos tablica od 1 21 kolejka tablica 6 stos lista 22 kolejka lista 7 stos tablica od 0 23 kolejka tablica 8 stos lista 24 kolejka lista 9 stos tablica od 1 25 kolejka tablica 10 stos lista 26 kolejka lista 11 stos tablica od 0 27 kolejka tablica 12 stos lista 28 kolejka lista 13 stos tablica od 1 29 kolejka tablica 14 stos lista 30 kolejka lista 15 stos tablica od 0 31 kolejka tablica 16 stos lista 32 kolejka lista
Plan ćwiczenia Wariant "Stos, tablica, indeks stosu od -1" a) Obiekty graficzne Wywołać środowisko Microsoft Visual Studio 2005. Wybrać punkt menu File / New / Project.., zaznaczyć język programowania Visual Basic, rodzaj aplikacji Windows Application, wprowadzić na dole okna nazwę projektu, na przykład ProjektStos, i katalog do umieszczenia projektu. Wprowadzić nagłówek formularzu Stos. Wariant "tablica, indeks stosu od -1". Dodać do formularza obiekty graficzne: - do wprowadzenia rozmiaru stosu, - do wyświetlenia zawartości stosu i elementu na wierzchu stosu, - do wprowadzenia nowego elementu w celu odkładania na stos, - do komunikowania o przepełnieniu stosu, - do zdejmowania elementu ze stosu, - do wyświetlenia elementu zdejmowanego ze stosu, - do komunikowania o tym, że stos jest pusty. Wprowadzenie rozmiaru stosu oraz nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Akceptuj. Lepiej obydwa obiekty włożyć do obiektu typu GroupBox z napisem "Rozmiar stosu" lub "Rozmiar kolejki". Do wyświetlenia zawartości stosu oraz elementu na wierzchu stosu jest wygodnie korzystać z obiektu typu ListBox. Wierzchowi stosu może odpowiadać zaznaczony wiersz ListBox a. Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Dodaj. Zdejmowanie elementu ze stosu możną inicjować naciśnięciem klawiszu "Zdejmij" lub "Odczyt" typu Button. Zdejmowaną (odczytaną) wartość można pokazać w okienku typu TextBox. Bazowe operacje na stosie powinny być realizowane ze sprawdzaniem, czy jest stos pusty oraz czy jest stos zapełniony. Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu StatusBar. Wyświetlenie komunikatu w obiekcie typu StatusBar: StatusBar1.Text = "..." Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie standardowej funkcji MsgBox: MsgBox("...",MsgBoxStyle.OKOnly, "Komunikat") Jeszcze jeden sposób wyświetlenia tekstów komunikatów - wykorzystanie dodatkowego formularza: Wierzchowi stosu może odpowiadać zaznaczony wiersz ListBox a. Aby zaznaczać pojedynczy wiersz w obiekcie typu ListBox należy ustawić właściwość SelectionMode na "One". Właściwość SelectedIndex ListBox'a służy do wyboru wierszu do zaznaczenia. Przykładowo: ListBox1->SelectedIndex=-1 'brak zaznaczonego wierszu ListBox1->SelectedIndex=2 'zaznaczony jest wiersz 3 z indeksem 2 (indeksy od 0) Należy ustawić na False właściwość Enabled obiektu ListBox1, aby użytkownik nie mógł zaznaczać wierszy myszą.
Zmienną do przechowywania indeksu elementu na wierzchu stosu oraz zmienną do przechowywania rozmiaru stosu należy zadeklarować w klasie formularza, na przykład: Dim RS As Integer 'rozmiar stosu Dim js As Integer = -1 (lub 0) 'indeks stosu W przypadku korzystania z obiektu typu ListBox do wyświetlenia zawartości stosu nie jest potrzebna tablica stosu - role tej tablicy spełnia obiekt ListBox1. Warunek "czy jest stos pusty" sprawdzamy następująco: If js < 0 Then ''' komunikat "Stos jest pusty" ''' instrukcje zdejmowania elementu ze stosu Warunek "czy jest stos zapełniony" sprawdzamy następująco: If js>=rs-1 Then ''' komunikat "Stos jest zapełniony" ''' instrukcje odkładania elementu na stos b) Oprogramować bazowe operacje Wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawiszu Akceptuj, należy wpisać następujące instrukcji do wprowadzenia rozmiaru stosu: RS = NumericUpDown1.Value ListBox1.Items.Clear() Dim I As Integer For I = 0 To (RS - 1) ListBox1.Items.Add(0) Next I ListBox1.SelectedIndex = -1 W przytoczonej procedurze ma miejsce dodawanie do ListBox a pustych elementów w ilości równej wprowadzonemu rozmiarowi stosu. Do tej procedury należy dodać ustawienie początkowe indeksu stosu: js = -1 W przypadku początkowej wartości indeksu stosu równej -1 w celu dodawania do stosu nowego elementu korzystamy z dwóch instrukcji: 1) zwiększenie indeksu stosu o jeden, 2) zapisywanie do tablicy stosu nowego elementu według indeksu stosu. Instrukcji należy rozmieścić wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawiszu Dodaj : Dim elem As Integer = NumericUpDown2.Value If js >= RS - 1 Then js += 1
ListBox1.Items(js) = elem.tostring() ListBox1.SelectedIndex = js W przypadku początkowej wartości indeksu stosu równej -1 w celu zdejmowania elementu ze stosu korzystamy z dwóch instrukcji: 1) odczyt z tablicy stosu elementu według indeksu stosu, 2) zmniejszenie indeksu stosu o jeden. Tekst procedury, wywoływanej systemem po naciśnięciu klawiszu "Zdejmij": Dim str As String If js < 0 Then ' zdejmowanie ze stosu TextBox3.Text = ListBox1.Items(js).ToString() ' wartość w postaci tekstowej js -= 1 ListBox1.SelectedIndex = js c) Eksperyment 1. Wprowadzić rozmiar stosu równy 7. 2. Wypróbować zdejmowanie elementu ze stosu i otrzymać komunikat, że stos jest pusty. 3. Wprowadzić i położyć na stos 3-5 elementów danych (liczb) sprawdzając poprawność odkładania i przemieszczenia wskaźnika stosu. 4. Zdejmować ze stosu 2-3 elementów danych (liczb) sprawdzając poprawność wyprowadzenia i przemieszczenia wskaźnika stosu. 5. Wprowadzać do stosu elementy danych (liczby) do otrzymania komunikatu o przepełnieniu stosu. Wypróbować projekt w trybie Build / Build Solution. Uruchomić program w trybie Debug / Start Debugging. Uwaga. Jeżeli w trybie Build... otrzymujemy komunikat Sub Main not found in..., to należy nacisnąć Project /...Properties.. i na zakładce Application w polu Startup form wybrać nazwę głównego formularza. Zapisać projekt w trybie File / Save All. Wyprodukować EXE - plik w trybie Build / Build nazwa_projektu. Pokazać pracujący program prowadzącemu.
Wariant "Stos, tablica, indeks stosu od 0" a) Obiekty graficzne Wywołać środowisko Microsoft Visual Studio 2005. Wybrać punkt menu File / New / Project.., zaznaczyć język programowania Visual Basic, rodzaj aplikacji Windows Application, wprowadzić na dole okna nazwę projektu, na przykład ProjektStos, i katalog do umieszczenia projektu. Wprowadzić nagłówek formularzu Stos. Wariant "tablica, indeks stosu od 0". Dodać do formularza obiekty graficzne: - do wprowadzenia rozmiaru stosu, - do wyświetlenia zawartości stosu i elementu na wierzchu stosu, - do wprowadzenia nowego elementu w celu odkładania na stos, - do komunikowania o przepełnieniu stosu, - do zdejmowania elementu ze stosu, - do wyświetlenia elementu zdejmowanego ze stosu, - do komunikowania o tym, że stos jest pusty. Wprowadzenie rozmiaru stosu oraz nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Akceptuj. Lepiej obydwa obiekty włożyć do obiektu typu GroupBox z napisem "Rozmiar stosu" lub "Rozmiar kolejki". Do wyświetlenia zawartości stosu oraz elementu na wierzchu stosu jest wygodnie korzystać z obiektu typu ListBox. Wierzchowi stosu może odpowiadać zaznaczony wiersz ListBox a. Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Dodaj. Zdejmowanie elementu ze stosu możną inicjować naciśnięciem klawiszu "Zdejmij" lub "Odczyt" typu Button. Zdejmowaną (odczytaną) wartość można pokazać w okienku typu TextBox. Bazowe operacje na stosie powinny być realizowane ze sprawdzaniem, czy jest stos pusty oraz czy jest stos zapełniony. Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu StatusBar. Wyświetlenie komunikatu w obiekcie typu StatusBar: StatusBar1.Text = "..." Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie standardowej funkcji MsgBox: MsgBox("...",MsgBoxStyle.OKOnly, "Komunikat") Jeszcze jeden sposób wyświetlenia tekstów komunikatów - wykorzystanie dodatkowego formularza: Wierzchowi stosu może odpowiadać zaznaczony wiersz ListBox a. Aby zaznaczać pojedynczy wiersz w obiekcie typu ListBox należy ustawić właściwość SelectionMode na "One". Właściwość SelectedIndex ListBox'a służy do wyboru wierszu do zaznaczenia. Przykładowo: ListBox1->SelectedIndex=-1 'brak zaznaczonego wierszu ListBox1->SelectedIndex=2 'zaznaczony jest wiersz 3 z indeksem 2 (indeksy od 0) Należy ustawić na False właściwość Enabled obiektu ListBox1, aby użytkownik nie mógł zaznaczać wierszy myszą. Zmienną do przechowywania indeksu elementu na wierzchu stosu oraz zmienną do przechowywania rozmiaru stosu należy zadeklarować w klasie formularza, na przykład:
Dim RS As Integer 'rozmiar stosu Dim js As Integer = 0 'indeks stosu W przypadku korzystania z obiektu typu ListBox do wyświetlenia zawartości stosu nie jest potrzebna tablica stosu - role tej tablicy spełnia obiekt ListBox1. Warunek "czy jest stos pusty" sprawdzamy następująco: If js = 0 Then ''' komunikat "Stos jest pusty" ''' instrukcje zdejmowania elementu ze stosu Warunek "czy jest stos zapełniony" sprawdzamy następująco: If js>=rs Then ''' komunikat "Stos jest zapełniony" ''' instrukcje odkładania elementu na stos b) Oprogramować bazowe operacje Wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawiszu Akceptuj, należy wpisać następujące instrukcji do wprowadzenia rozmiaru stosu: RS = NumericUpDown1.Value ListBox1.Items.Clear() Dim I As Integer For I = 0 To RS ListBox1.Items.Add(0) Next I ListBox1.SelectedIndex = -1 W przytoczonej procedurze ma miejsce dodawanie do ListBox a pustych elementów w ilości większej o jeden wprowadzonemu rozmiarowi stosu. Do tej procedury należy dodać ustawienie początkowe indeksu stosu: js = 0 W przypadku początkowej wartości indeksu stosu równej 0 w celu dodawania do stosu nowego elementu korzystamy z dwóch instrukcji: 1) zapisywanie do tablicy stosu nowego elementu według indeksu stosu, 2) zwiększenie indeksu stosu o jeden. Instrukcji należy rozmieścić wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawiszu Dodaj : Dim elem As Integer = NumericUpDown2.Value If js >= RS Then ListBox1.Items(js) = elem.tostring() js += 1 ListBox1.SelectedIndex = js
W przypadku początkowej wartości indeksu stosu równej 0 w celu zdejmowania elementu ze stosu korzystamy z dwóch instrukcji: 1) zmniejszenie indeksu stosu o jeden, 2) odczyt z tablicy stosu elementu według indeksu stosu. Tekst procedury, wywoływanej systemem po naciśnięciu klawiszu "Zdejmij": Dim str As String If js = 0 Then js -= 1 ' zdejmowanie ze stosu TextBox3.Text = ListBox1.Items(js).ToString() ' wartość w postaci tekstowej ListBox1.SelectedIndex = js c) Eksperyment 1) Wprowadzić rozmiar stosu równy 7. 2) Wypróbować zdejmowanie elementu ze stosu i otrzymać komunikat, że stos jest pusty. 3) Wprowadzić i położyć na stos 3-5 elementów danych (liczb) sprawdzając poprawność odkładania i przemieszczenia wskaźnika stosu. 4) Zdejmować ze stosu 2-3 elementów danych (liczb) sprawdzając poprawność wyprowadzenia i przemieszczenia wskaźnika stosu. 5) Wprowadzać do stosu elementy danych (liczby) do otrzymania komunikatu o przepełnieniu stosu. Wypróbować projekt w trybie Build / Build Solution. Uruchomić program w trybie Debug / Start. Uwaga. Jeżeli w trybie Build... otrzymujemy komunikat Sub Main not found in..., to należy nacisnąć Project /...Properties.. i na zakładce Application w polu Startup form wybrać nazwę głównego formularza. Zapisać projekt w trybie File / Save All. Wyprodukować EXE - plik w trybie Build / Build nazwa_projektu. Pokazać pracujący program prowadzącemu.
Wariant "Stos, lista" a) Obiekty graficzne Wywołać środowisko Microsoft Visual Studio 2005. Wybrać punkt menu File / New / Project.., zaznaczyć język programowania Visual Basic, rodzaj aplikacji Windows Application, wprowadzić na dole okna nazwę projektu, na przykład ProjektStos, i katalog do umieszczenia projektu. Wprowadzić nagłówek formularzu Stos. Wariant "lista". Dodać do formularza obiekty graficzne: - do wprowadzenia rozmiaru stosu, - do wyświetlenia zawartości stosu i elementu na wierzchu stosu, - do wprowadzenia nowego elementu w celu odkładania na stos, - do komunikowania o przepełnieniu stosu, - do zdejmowania elementu ze stosu, - do wyświetlenia elementu zdejmowanego ze stosu, - do komunikowania o tym, że stos jest pusty. Wprowadzenie rozmiaru stosu oraz nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Akceptuj. Lepiej obydwa obiekty włożyć do obiektu typu GroupBox z napisem "Rozmiar stosu" lub "Rozmiar kolejki". Do wyświetlenia zawartości stosu oraz elementu na wierzchu stosu jest wygodnie korzystać z obiektu typu ListBox. Wierzchowi stosu może odpowiadać zaznaczony wiersz ListBox a. Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Dodaj. Zdejmowanie elementu ze stosu możną inicjować naciśnięciem klawiszu "Zdejmij" lub "Odczyt" typu Button. Zdejmowaną (odczytaną) wartość można pokazać w okienku typu TextBox. Bazowe operacje na stosie powinny być realizowane ze sprawdzaniem, czy jest stos pusty oraz czy jest stos zapełniony. Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu StatusBar. Wyświetlenie komunikatu w obiekcie typu StatusBar: StatusBar1.Text = "..." Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie standardowej funkcji MsgBox: MsgBox("...",MsgBoxStyle.OKOnly, "Komunikat") Jeszcze jeden sposób wyświetlenia tekstów komunikatów - wykorzystanie dodatkowego formularza: Wierzchowi stosu może odpowiadać zaznaczony wiersz ListBox a. Aby zaznaczać pojedynczy wiersz w obiekcie typu ListBox należy ustawić właściwość SelectionMode na "One". Właściwość SelectedIndex ListBox'a służy do wyboru wierszu do zaznaczenia. Przykładowo: ListBox1->SelectedIndex=-1 'brak zaznaczonego wierszu ListBox1->SelectedIndex=2 'zaznaczony jest wiersz 3 z indeksem 2 (indeksy od 0) Należy ustawić na False właściwość Enabled obiektu ListBox1, aby użytkownik nie mógł zaznaczać wierszy myszą. Zmienną do przechowywania rozmiaru stosu należy zadeklarować w klasie formularza, na przykład: Dim RS As Integer = 0 'rozmiar stosu
Obiekt ListBox1 typu ListBox przeznaczymy do wyświetlenia zawartości stosu, którego elementy będą rozproszone w elementach listy. W przypadku korzystania z obiektu ListBox1 nie jest potrzebny indeks stosu. Zadeklarujemy element listy: Structure selem 'struktura elementu listy Dim dana As Integer 'pole danych Dim nast As Object 'referencja do elementu następnego 'konstruktor: Public Sub New(ByVal d As Integer, ByRef p As Object) dana = d nast = p End Structure Zadeklarujemy referencję do pierwszego elementu listy: Dim pocz As Object = Nothing Warunek "czy jest stos pusty" sprawdzamy następująco: If pocz Is Nothing Then ''' komunikat "Stos jest pusty" ''' instrukcje zdejmowania elementu ze stosu Warunek "czy jest stos zapełniony" sprawdzamy następująco: Dim rr As Integer rr = fobliczrozmiar() If rr = RS Then ''' komunikat "Stos jest zapełniony" ''' instrukcje odkładania elementu na stos gdzie fobliczrozmiar jest funkcją obliczenia rozmiaru listy: Private Function fobliczrozmiar() As Integer Dim I As Integer = 0 Dim p As Object = pocz 'referencja tymczasowa While Not p Is Nothing p = p.nast I += 1 End While Return I End Function Wprowadzenie rozmiaru stosu: Private Sub ButtonAkceptuj_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAkceptuj.Click RS = NumericUpDown1.Value fpokazliste() Funkcja wyświetlenia zawartości stosu: Private Sub fpokazliste()
ListBox1.Items.Clear() Dim p As Object = pocz 'referencja tymczasowa While Not p Is Nothing Dim elem As Integer = p.dana ListBox1.Items.Add(elem) p = p.nast End While If Not pocz Is Nothing Then ListBox1.SelectedIndex = 0 ListBox1.SelectedIndex = -1 b) Oprogramować bazowe operacje Odkładanie elementu na stos jest równoważnie dodawaniu elementu na początku listy: Private Sub ButtonDodaj_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDodaj.Click Dim str As String = TextBox2.Text Dim elem As Integer = CInt(str) Dim nn As Integer nn = fobliczrozmiar() If nn >= RS Then Dim p As Object 'referencja tymczasowa p = New selem(elem, Nothing) p.nast = pocz pocz = p fpokazliste() Zdejmowanie elementu ze stosu jest równoważnie odejmowaniu elementu z początku listy: Private Sub ButtonOdczyt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOdczyt.Click Dim str As String If pocz Is Nothing Then MsgBox("Stos jest pusty", MsgBoxStyle.OKOnly, "Komunikat") ' ' Dim elem As Integer = pocz.dana TextBox3.Text = elem.tostring() pocz = pocz.nast fpokazliste() c) Eksperyment 1) Wprowadzić rozmiar stosu równy 7. 2) Wypróbować zdejmowanie elementu ze stosu i otrzymać komunikat, że stos jest pusty. 3) Wprowadzić i położyć na stos 3-5 elementów danych (liczb) sprawdzając poprawność odkładania i przemieszczenia wskaźnika stosu. 4) Zdejmować ze stosu 2-3 elementów danych (liczb) sprawdzając poprawność wyprowadzenia i przemieszczenia wskaźnika stosu.
5) Wprowadzać do stosu elementy danych (liczby) do otrzymania komunikatu o przepełnieniu stosu. Wypróbować projekt w trybie Build / Build Solution. Uruchomić program w trybie Debug / Start. Uwaga. Jeżeli w trybie Build... otrzymujemy komunikat Sub Main not found in..., to należy nacisnąć Project /...Properties.. i na zakładce Application w polu Startup form wybrać nazwę głównego formularza. Zapisać projekt w trybie File / Save All. Wyprodukować EXE - plik w trybie Build / Build nazwa_projektu. Pokazać pracujący program prowadzącemu.
Wariant "Kolejka, tablica" a) Obiekty graficzne Wywołać środowisko Microsoft Visual Studio 2005. Wybrać punkt menu File / New / Project.., zaznaczyć język programowania Visual Basic, rodzaj aplikacji Windows Application, wprowadzić na dole okna nazwę projektu, na przykład ProjektKolejka, i katalog do umieszczenia projektu. Wprowadzić nagłówek formularzu Kolejka. Wariant "tablica". Dodać do formularza obiekty graficzne: - do wprowadzenia rozmiaru kolejki, - do wyświetlenia zawartości kolejki i elementów na początku i końcu kolejki, - do wprowadzenia nowego elementu w celu zapisywania do kolejki, - do komunikowania o przepełnieniu kolejki, - do odczytu elementu z kolejki, - do wyświetlenia elementu odczytanego z kolejki, - do komunikowania o tym, że kolejka jest pusta. Wprowadzenie rozmiaru kolejki oraz nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Akceptuj. Lepiej obydwa obiekty włożyć do obiektu typu GroupBox z napisem "Rozmiar kolejki". Do wyświetlenia zawartości kolejki oraz elementów na początku i końcu kolejki jest wygodnie korzystać z obiektu typu ListBox. Początku i końcu kolejki może odpowiadać zaznaczony wiersz ListBox a. Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Dodaj. Odczyt elementu z kolejki możną inicjować naciśnięciem klawiszu "Odczyt" typu Button. Odczytaną wartość można pokazać w okienku typu TextBox. Bazowe operacje na kolejce powinny być realizowane ze sprawdzaniem, czy jest kolejka pusta oraz czy jest kolejka zapełniona. Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu StatusBar. Wyświetlenie komunikatu w obiekcie typu StatusBar: StatusBar1.Text = "..." Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie standardowej funkcji MsgBox: MsgBox("...",MsgBoxStyle.OKOnly, "Komunikat") Jeszcze jeden sposób wyświetlenia tekstów komunikatów - wykorzystanie dodatkowego formularza: Indeksom kolejki mogą odpowiadać dwa zaznaczonych wierszy ListBox a. Aby wyświetlić dwa wierszy w obiekcie typu ListBox, właściwość SelectionMode musi być ustawiona na "MultiSimple". Wierszy w obiekcie typu ListBox należy zaznaczać przez metodę SetSelected. Przykładowo: ListBox1.SetSelected(0,True) 'zaznaczony jest pierwszy wiersz z indeksem 0 ListBox1.SetSelected(0,False) 'zdejmowanie zaznaczenia wierszu 0 ListBox1.SetSelected(2,True) 'zaznaczony jest trzeci wiersz z indeksem 2 Należy ustawić na False właściwość Enabled obiektu ListBox1, aby użytkownik nie mógł zaznaczać wierszy myszą.
Zmienne do przechowywania indeksów kolejki oraz zmienną do przechowywania rozmiaru kolejki należy zadeklarować w klasie formularza, na przykład: Dim jpk As Integer 'indeks początku kolejki Dim jkk As Integer 'indeks końca kolejki Dim RK As Integer 'rozmiar kolejki W przypadku korzystania z obiektu typu ListBox do wyświetlenia zawartości kolejki nie jest potrzebna tablica kolejki - role tej tablicy spełnia obiekt ListBox1. Warunek "czy jest kolejka pusta" sprawdzamy następująco: If jpk=jkk Then ''' komunikat "Kolejka jest pusta" ''' instrukcje odczytu elementu z kolejki Warunek "czy jest kolejka zapełniona" sprawdzamy następująco: If jkk>=rk Then ''' komunikat "Kolejka jest zapełniona" ''' instrukcje dodawania elementu do kolejki b) Oprogramować bazowe operacje Zmienne do przechowywania indeksów elementów na początku i końcu kolejki oraz rozmiaru kolejki należy zadeklarować w klasie formularza, na przykład: Dim RK As Integer Dim jpk As Integer = 0 Dim jkk As Integer = 0 Tablica - kolejka nie jest potrzebna - role tej tablicy spełnia obiekt ListBox1. Po odczytaniu lub zapisywaniu do kolejki indeks początku lub końcu kolejki jest zwiększany o jeden i dlatego w przypadku kolejki liczba wierszy w obiekcie typu ListBox musi być o jeden większa niż maksymalny rozmiar kolejki. Wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawiszu Akceptuj, należy wpisać następujące instrukcji do wprowadzenia rozmiaru kolejki: RK = NumericUpDown1.Value ListBox1.Items.Clear() Dim I As Integer For I = 0 To RS ListBox1.Items.Add(0) Next I ListBox1.SelectedIndex = 0 W przytoczonej procedurze ma miejsce dodawanie do ListBox a pustych elementów w ilości większej o jeden wprowadzonemu rozmiarowi kolejki. Do tej procedury należy dodać ustawienie początkowe indeksów kolejki: jpk = 0 jkk = 0
Aby dodać do kolejki nowy element korzystamy z dwóch instrukcji: 1) zapisywanie do tablicy kolejki nowego elementu według indeksu jkk końca kolejki, 2) zwiększenie indeksu jkk końca kolejki o jeden. Instrukcji należy rozmieścić wewnątrz procedury, którą tworzy system w odpowiedzi na podwójne klikniecie klawiszu Dodaj : Dim elem As Integer = NumericUpDown2.Value If jkk >= RK Then ListBox1.Items(jkk) = elem.tostring() ListBox1.SetSelected(jkk, False) jkk += 1 ListBox1.SetSelected(jkk, True) ListBox1.SetSelected(jpk, True) W celu odejmowania elementu od kolejki korzystamy z dwóch instrukcji: 1) odczyt z tablicy kolejki elementu według indeksu jpk początku kolejki, 2) zwiększenie indeksu jpk początku kolejki o jeden.. Tekst procedury, wywoływanej systemem po naciśnięciu klawiszu "Odczyt": Dim str As String If jpk = jkk Then TextBox3.Text = ListBox1.Items(jpk).ToString() ' wartość w postaci tekstowej ListBox1.SetSelected(jpk, False) jpk += 1 ListBox1.SetSelected(jpk, True) ListBox1.SetSelected(jkk, True) c) Eksperyment 1. Wprowadzić rozmiar kolejki równy 7. 2. Wypróbować odczyt elementu z kolejki i otrzymać komunikat, że kolejka jest pusta. 3. Wprowadzić do kolejki 3-5 elementów danych (liczb) sprawdzając poprawność zapisywania i przemieszczenia wskaźnika końca kolejki. 4. Odczytywać z kolejki 2-3 elementów danych (liczb) sprawdzając poprawność wyprowadzenia i przemieszczenia wskaźnika początku kolejki. 5. Wprowadzać do kolejki elementy danych (liczby) do otrzymania komunikatu o przepełnieniu kolejki. Wypróbować projekt w trybie Build / Build Solution. Uruchomić program w trybie Debug / Start. Uwaga. Jeżeli w trybie Build... otrzymujemy komunikat Sub Main not found in..., to należy nacisnąć Project /...Properties.. i na zakładce Application w polu Startup form wybrać nazwę głównego formularza. Zapisać projekt w trybie File / Save All. Wyprodukować EXE - plik w trybie Build / Build nazwa_projektu. Pokazać pracujący program prowadzącemu.
Wariant "Kolejka, lista" a) Obiekty graficzne Wywołać środowisko Microsoft Visual Studio 2005. Wybrać punkt menu File / New / Project.., zaznaczyć język programowania Visual Basic, rodzaj aplikacji Windows Application, wprowadzić na dole okna nazwę projektu, na przykład ProjektKolejka, i katalog do umieszczenia projektu. Wprowadzić nagłówek formularzu Kolejka. Wariant "lista". Dodać do formularza obiekty graficzne: - do wprowadzenia rozmiaru kolejki, - do wyświetlenia zawartości kolejki i elementów na początku i końcu kolejki, - do wprowadzenia nowego elementu w celu zapisywania do kolejki, - do komunikowania o przepełnieniu kolejki, - do odczytu elementu z kolejki, - do wyświetlenia elementu odczytanego z kolejki, - do komunikowania o tym, że kolejka jest pusta. Wprowadzenie rozmiaru kolejki oraz nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Akceptuj. Lepiej obydwa obiekty włożyć do obiektu typu GroupBox z napisem "Rozmiar kolejki". Do wyświetlenia zawartości kolejki oraz elementów na początku i końcu kolejki jest wygodnie korzystać z obiektu typu ListBox. Początku i końcu kolejki może odpowiadać zaznaczony wiersz ListBox a. Wprowadzenie nowego elementu lepiej realizować za pomocą dwóch obiektów: okienka typu NumericUpDown i klawiszu typu Button z napisem Dodaj. Odczyt elementu z kolejki możną inicjować naciśnięciem klawiszu "Odczyt" typu Button. Odczytaną wartość można pokazać w okienku typu TextBox. Bazowe operacje na kolejce powinny być realizowane ze sprawdzaniem, czy jest kolejka pusta oraz czy jest kolejka zapełniona. Do wyświetlenia tekstów komunikatów można dodać do formularza obiekt typu StatusBar. Wyświetlenie komunikatu w obiekcie typu StatusBar: StatusBar1.Text = "..." Inny sposób wyświetlenia tekstów komunikatów - wykorzystanie standardowej funkcji MsgBox: MsgBox("...",MsgBoxStyle.OKOnly, "Komunikat") Jeszcze jeden sposób wyświetlenia tekstów komunikatów - wykorzystanie dodatkowego formularza: Indeksom kolejki mogą odpowiadać dwa zaznaczonych wierszy ListBox a. Aby wyświetlić dwa wierszy w obiekcie typu ListBox, właściwość SelectionMode musi być ustawiona na "MultiSimple". Wierszy w obiekcie typu ListBox należy zaznaczać przez metodę SetSelected. Przykładowo: ListBox1.SetSelected(0,True) 'zaznaczony jest pierwszy wiersz z indeksem 0 ListBox1.SetSelected(0,False) 'zdejmowanie zaznaczenia wierszu 0 ListBox1.SetSelected(2,True) 'zaznaczony jest trzeci wiersz z indeksem 2
Należy ustawić na False właściwość Enabled obiektu ListBox1, aby użytkownik nie mógł zaznaczać wierszy myszą. Zmienną do przechowywania rozmiaru kolejki należy zadeklarować w klasie formularza, na przykład: Dim RK As Integer = 0 'rozmiar kolejki Obiekt ListBox1 typu ListBox przeznaczymy do wyświetlenia zawartości kolejki, której elementy będą rozproszone w elementach listy. W przypadku korzystania z obiektu ListBox1 nie są potrzebne indeksy kolejki. Zadeklarujemy element listy: Structure selem 'struktura elementu listy Dim dana As Integer 'pole danych Dim nast As Object 'referencja do elementu następnego 'konstruktor: Public Sub New(ByVal d As Integer, ByRef p As Object) dana = d nast = p End Structure Zadeklarujemy referencje do pierwszego i ostatniego elementu listy - końca i początku kolejki: Dim ppk As Object = Nothing 'referencje do ostatniego elementu listy - początku kolejki Dim pkk As Object = Nothing 'referencje do pierwszego elementu listy - końca kolejki W języku VB/NET są trudności z porównaniem referencji, którą (porównanie) jest potrzebne w operacjach kolejki na bazie listy. Aby znaleźć element listy, na który wskazuje referencja ppk, jest potrzebny przegląd listy. Problem tkwi w tym, że operator przypisania w języku VB/NET produkuje kopię obiektu wskazanego z prawej strony operatora. Instrukcja typu pt = ppk powoduje kopiowanie do obiektu pt całego łańcucha elementów listy. Instrukcja typu pt = pt.nast w cyklu przeglądu listy powoduje za każdym razem nową alokację elementu pt i kopiowanie do nowego obiektu pt pozostałego łańcucha z elementów listy. W wyniku nowej alokacji element pt jest oderwany od pierwszych elementów listy. Instrukcja typu pt.nast = p podłącza dodawany element listy do aktualnego elementu pt, ale ten element w wyniku ostatniego kopiowania jest oderwany od listy. Brak bezpośrednich operacji na adresach (wskaźnikach) jest wielką wadą języka VB/NET. W celu rozwiązania problemu włóżmy element listy w sztuczny obiekt, który będzie służyć jako otoczka elementu listy. Wykonanie operatora przypisania dla obiektu-otoczki będzie powodować alokację nowego obiektu-otoczki i "oderwanie" otoczek, ale wewnątrz otoczek nie będą zmienione wartości referencji do elementów listy. Pomysłowi odpowiada niżej przytoczona struktura spelem: Structure spelem 'struktura - otoczka Public ps As Object Public Sub New(ByVal d As Integer) 'konstruktor otoczki ps = New selem(d, Nothing) 'alokacja elementu listy 'ustawienie pola danych: Public Sub UstDana(ByVal nowa As Integer) ps.dana = nowa 'odczyt pola danych: Public Function PodajDana() As Integer Return ps.dana End Function 'ustawienie następnika: Public Sub UstawNast(ByVal pnowy As Object) ps.nast = pnowy
'odczyt następnika: Public Function PodajNast() As Object Return ps.nast End Function Public Function CzyNastZero() As Boolean Return ps.nast Is Nothing End Function Public Function CzyNastJestTen(ByVal p2 As Object) As Boolean Return ps.nast.ps Is p2.ps End Function Public Function CzyTenSamy(ByVal p2 As Object) As Boolean Return ps Is p2.ps End Function End Structure Jak widać, struktura spelem zawiera dużą ilość metod dla operacji na schowanym w otoczce elemencie listy. Warunek "czy jest kolejka pusta" sprawdzamy następująco: If ppk Is Nothing Or pkk Is Nothing Then ''' komunikat "Kolejka jest pusta" ''' instrukcje odczytu elementu z kolejki Warunek "czy jest kolejka zapełniona" sprawdzamy następująco: Dim rr As Integer rr = fobliczrozmiar() If rr = RK Then ''' komunikat "Kolejka jest zapełniona" ''' instrukcje dodawania elementu do kolejki gdzie fobliczrozmiar jest funkcją obliczenia rozmiaru listy: Private Function fobliczrozmiar() As Integer Dim I As Integer = 0 Dim p As Object = pkk 'referencja tymczasowa While Not p Is Nothing p = p.podajnast() I += 1 End While Return I End Function Wprowadzenie rozmiaru kolejki: Private Sub ButtonAkceptuj_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAkceptuj.Click RS = NumericUpDown1.Value fpokazliste() Funkcja wyświetlenia zawartości kolejki: Private Sub fpokazliste() ListBox1.Items.Clear()
Dim p As Object = pkk 'referencja tymczasowa While Not p Is Nothing Dim elem As Integer = p.podajdana() ListBox1.Items.Add(elem) p = p.podajnast() End While If Not pkk Is Nothing Then ListBox1.SetSelected(0, True) Dim rr As Integer rr = fobliczrozmiar() If rr > 0 Then ListBox1.SetSelected(rr - 1, True) b) Oprogramować bazowe operacje Dodawanie elementu do kolejki jest równoważnie dodawaniu elementu na początku listy: Private Sub ButtonDodaj_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDodaj.Click Dim str As String = TextBox2.Text Dim elem As Integer = CInt(str) Dim nn As Integer nn = fobliczrozmiar() If nn >= RK Then Dim p As Object = Nothing 'referencja tymczasowa p = New spelem(elem) If ppk Is Nothing Then ppk = p p.ustawnast(pkk) pkk = p fpokazliste() Odejmowanie elementu od kolejki jest równoważnie odejmowaniu elementu z końca listy: Private Sub ButtonOdczyt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonOdczyt.Click Dim str As String If pkk Is Nothing Or ppk Is Nothing Then TextBox3.Text = "" MsgBox("Kolejka jest pusta", MsgBoxStyle.OKOnly, "Komunikat") ' ' Dim elem As Integer = ppk.podajdana() TextBox3.Text = elem.tostring() Dim p As Object = pkk 'referencja tymczasowa If p.czytensamy(ppk) Then ppk = Nothing pkk = Nothing
While Not p.czynastjestten(ppk) p = p.podajnast() End While p.ustawnast(nothing) ppk = p fpokazliste() c) Eksperyment 1. Wprowadzić rozmiar kolejki równy 7. 2. Wypróbować odczyt elementu z kolejki i otrzymać komunikat, że kolejka jest pusta. 3. Wprowadzić do kolejki 3-5 elementów danych (liczb) sprawdzając poprawność zapisywania i przemieszczenia wskaźnika końca kolejki. 4. Odczytywać z kolejki 2-3 elementów danych (liczb) sprawdzając poprawność wyprowadzenia i przemieszczenia wskaźnika początku kolejki. 5. Wprowadzać do kolejki elementy danych (liczby) do otrzymania komunikatu o przepełnieniu kolejki. Wypróbować projekt w trybie Build / Build Solution. Uruchomić program w trybie Debug / Start. Uwaga. Jeżeli w trybie Build... otrzymujemy komunikat Sub Main not found in..., to należy nacisnąć Project /...Properties.. i na zakładce Application w polu Startup form wybrać nazwę głównego formularza. Zapisać projekt w trybie File / Save All. Wyprodukować EXE - plik w trybie Build / Build nazwa_projektu. Pokazać pracujący program prowadzącemu.
Załącznik Stos Stosem (ang. stack) programowym nazywamy obszar pamięci komputerowej, do którego możemy zapisywać kolejno porcje danych i czytać te porcji w kolejności ostatni zapisany - pierwszy przeczytany (ang. Last Input, First Output - LIFO). Typowymi operacjami nad danymi zachowanymi na stosie są: - zapisywanie (położenie, załadowanie) na stos, - czytanie (zdejmowanie) ze stosu, - czytanie elementu na wierzchu stosu, - sprawdzanie, czy stos jest pusty, - sprawdzanie, czy stos nie jest przepełniony. Stos z wykorzystaniem tablicy Jeżeli element danych zajmuje mniej miejsca niż możliwe miejsce w komórce pamięci, to do przechowywania elementu danych wykorzystuje się cała komórka. Na przykład jednobajtowa zmienna typu char będzie zapisywana jako młodszy bajt w 4-bajtowej komórce 32-bitowej pamięci operacyjnej. W przypadku, kiedy rozmiar elementu danych jest większy niż rozmiar komórki pamięci, to element będzie zapisywany w kolejnych komórkach stosu. Grupa komórek stosu zajmowanych jednym elementem nazywa się ramką (ang. frame) stosu. Zwykle ramki powstają przy zapisywaniu do stosu danych typu struktura. Jeżeli ramki są różnego rozmiaru, to ich obsługiwanie w programie nie jest proste. W związku z tym programista zwykle korzysta z innej metody zapisywania do stosu złożonych danych - metody zapisywania wskaźników na elementy danych, ponieważ wskaźniki (tj. adresy) mają jednakowe rozmiary, na przykład 4 bajty (32-bity). Same elementy danych mogą być zachowane w innych obszarach pamięci. Stos można realizować na podstawie tablicy lub dwukierunkowej listy. Lista dwukierunkowa działa jako stos, jeżeli nowy element dodajemy na końcu listy i zdejmujemy element też z końca. Wariant realizacji stosu na bazie listy dwukierunkowej wybiera się tylko w przypadku, jeżeli w realizacji algorytmu już są wykorzystywane listy, ponieważ stos na bazie tablicy działa szybciej. Dla stosu tablicowego (stosu na podstawie tablicy) jest potrzebny wskaźnik (indeks) pozycji wierzchu stosu. Indeks pozycji wierzchu stosu (krótko, indeks stosu) wskazuje na miejsce (indeks) w tablicy, w którym było wykonane ostatnie zapisywanie. W procesie zapisywania do stosu najpierw indeks stosu zwiększa się o jeden, a następnie według temu indeksowi zapisuje się nowy element. W przypadku czytania ze stosu najpierw indeks stosu wykorzystuje się do czytania z tablicy, a następnie indeks stosu zmniejsza się o jeden. Jasne, że początkowa wartość indeksu stosu powinna być równa (-1). Ta wartość indeksu stosu wskazuje też na stan stos jest pusty. Przepełnienie stosu nastąpi, jeżeli indeks stosu będzie równy rozmiarowi tablicy, tj. indeks stosu pokaże na miejsce poza tablicą. Realizacja w języku Visual Basic stosu tablicowego dla zmiennych typu Double Dim RS As Integer RS = 1000 'rozmiar stosu Dim stos() As Double 'stos - tablica ReDim stos(rs - 1) Dim js As Integer js = -1 'definicja indeksu stosu Dim dd As Double dd = 0.1 '... js = js + 1 stos(js) = dd 'odkładanie dd" na stos '... dd = stos(js) js = js - 1 'zdejmowanie dd" ze stosu '... If js > -1 Then 'sprawdzanie czy stos pusty?" dd = stos(js) 'pobranie dd" z frontu stosu '...
Stos z wykorzystaniem listy Lista działa jako stos, jeżeli nowy element danych jest dodawany i zdejmowany na początku lub na końcu listy. Rys. 1 pokazuje stany stosu z wykorzystaniem listy po wykonaniu dwóch operacji dodawania elementów i jednej operacji zdejmowania elementu. Rys. 1. Stany stosu z wykorzystaniem listy: stos pusty (a), stos po dodaniu elementu (b), stos po dodaniu jeszcze jednego elementu (c), stos po zdejmowaniu elementu (d) Poniższy przykład zawiera deklarację stosu jako klasy Stos. W metodach klasy są zaimplementowane operacje na stosie. Przykład w języku C++. Stos z wykorzystaniem listy struct sel { int liczba; /* pole danych */ sel* nast; /* wskaźnik na następny element */ sel(int elem) {liczba=elem; nast=null;} /* konstruktor */ }; class Stos { private: sel* Pocz;/*atrybut klasy, wskaźnik na początek listy*/ public: Stos() {Pocz=NULL;} ~Stos() { while (Pocz) { sel* pp=pocz; Pocz=pp->nast; delete pp; } } void Dodaj(sEl* pel) { if (pel) {pel->nast=pocz; Pocz=pel;}} sel* Zdejmuj() {sel* pp=pocz; if (pp) {Pocz=pp->nast; pp->nast=null;} return(pp);} sel* PodajWierzch() {return(pocz);} }; Kolejka Kolejką (ang. queue) programową nazywamy obszar pamięci komputerowej, do którego możemy zapisywać kolejno porcje danych i czytać te porcji w kolejności pierwszy zapisany - pierwszy przeczytany (ang. First Input, First Output - FIFO). Typowe operacje na danych zachowanych w kolejce: - zapisywanie do kolejki, - czytanie z kolejki, - sprawdzanie, czy kolejka jest pusta, - sprawdzanie, czy kolejka nie jest zapełniona. Kolejkę można realizować na podstawie tablicy lub jednokierunkowej listy. Lista jednokierunkowa działa jako kolejka, jeżeli nowy element dodajemy na końcu listy, a bierzemy element z początku. Wariant realizacji kolejki na bazie listy jednokierunkowej wybiera się tylko w przypadku, jeżeli w realizacji algorytmu już wykorzystywane były listy, ponieważ kolejka na bazie tablicy działa zasadniczo szybciej. Kolejka z wykorzystaniem tablicy Dla kolejki tablicowej (kolejki na podstawie tablicy) są potrzebne dwa wskaźniki (indeksy): - wskaźnik (indeks) na koniec kolejki, - wskaźnik (indeks) na początek kolejki. Indeks końca kolejki wskazuje na wolne miejsce (indeks) w tablicy, na które można zapisywać. Indeks początku kolejki wskazuje na miejsce (indeks), z którego można czytać. W procesie zapisywania do kolejki najpierw zapisywany jest nowy element wskazany przez indeks końca, a następnie indeks końca kolejki zwiększany jest o jeden. Jeżeli indeks końca kolejki osiąga
koniec bufora kolejki, to powstaje przepełnienie kolejki. Często kolejka jest realizowana jako kolejka cykliczna. W tym przypadku zamiast komunikatu o przepełnieniu kolejki indeks końca kolejki jest ustawiany na 0. W przypadku czytania z kolejki najpierw wykorzystywany jest indeks początku kolejki do czytania z tablicy, a następnie ten indeks zwiększany jest o jeden. Jeżeli indeks początku kolejki osiąga koniec bufory kolejki, to zamiast komunikatu o przepełnieniu kolejki ten indeks często jest ustawiany na 0. Jednakowa wartość indeksów kolejki wskazuje na stan kolejka jest pusta. Początkowa wartość indeksów kolejki jest ustawiana zwykle na 0. Zapełnienie kolejki nastąpi, jeżeli następna wartość indeksu końca kolejki będzie równa indeksowi początku kolejki. Realizacja w języku Visual Basic kolejki tablicowej dla zmiennych typu Double Dim RK As Integer = 1000 'rozmiar kolejki Dim kolej() As Double 'kolej - tablica ReDim kolej(rk - 1) 'kolej - tablica Dim jkk As Integer 'definicja indeksu końca kolejki jkk = 0 'zerowanie indeksu końca kolejki Dim jpk As Integer 'definicja indeksu początku kolejki jpk = 0 'zerowanie indeksu początku kolejki Dim dd As Double dd = 0.1 Dim dd2 As Double dd2 = 0 '... jkk = 0 jpk = 0 'zerowanie kolejki '... kolej(jkk) = dd 'zapisywanie dd" do kolejki jkk = jkk + 1 If jkk >= RK Then jkk = 0 lub komunikat o przepełnieniu '... If jpk <> jkk Then 'sprawdzanie czy kolejka pusta?" dd2 = kolej(jpk) 'odczyt dd" z frontu kolejki '... dd2 = kolej(jpk) 'pobranie dd" z kolejki jpk = jpk + 1 If jpk >= RK Then jpk = 0 lub komunikat o przepełnieniu '... Kolejka z wykorzystaniem listy Lista działa jako kolejka, jeżeli nowy element danych jest dodawany na końcu, a pobierany element danych jest odejmowany z początku listy, lub odwrotnie: element dodawany znajduje się na początku, a element pobierany - na końcu. Rys. 2 pokazuje stany kolejki z wykorzystaniem listy po wykonaniu trzech operacji dodawania elementów i jednej operacji pobierania elementu. Rys. 2. Stany kolejki z wykorzystaniem listy: kolejka pusta (a), kolejka po dodaniu elementu (b), kolejka po dodaniu jeszcze jednego elementu (c), kolejka po dodaniu jeszcze jednego elementu (d), kolejka po pobieraniu elementu (e)
Poniższy przykład zawiera deklarację kolejki jako klasy Kolejka. W metodach klasy są zaimplementowane operacji na kolejce. Przykład w języku C++. Kolejka z wykorzystaniem listy struct sel { int liczba; /* pole danych */ sel* nast; /* wskaźnik na następny element */ sel(int elem) {liczba=elem; nast=null;} /* konstruktor */ }; class Kolejka { private: sel* Pocz;/*atrybut klasy, wskaźnik na początek listy*/ public: Kolejka() {Pocz=NULL;} ~KolejList() { while (Pocz) { selkolej* pp=pocz; Pocz=pp->nast; delete pp; }} void Dodaj(sEl* pel) //dodawanie na początku listy {if (pel) {pel->nast=pocz; Pocz=pel;}} sel* Pobierz() //pobieranie z końca listy {sel* pp=pocz; sel* popsz=null; if (pp) while (pp->nast) {popsz=pp; pp=pp->nast;} if (popsz) popsz->nast=null; else Pocz=NULL; return(pp);} sel* PodajPierwszy() //pierwszy zapisany jest na końcu {sel* pp=pocz; if (pp) while (pp->nast) pp=pp->nast; return(pp);} sel* PodajOstatni() //ostatni zapisany jest na poczatku {return(pocz);} }; W przykładzie należy zwrócić uwagę, że wskaźnik Pocz wskazuje na początek listy, a nie kolejki; początek kolejki znajduje się na końcu listy.