|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
| SPIS TREŚCI |
|
| Tematy pomocnicze |
| Podrozdziały |
Stos (ang. Stack) jest sekwencyjną strukturą danych. Najprościej możemy go sobie wyobrazić jako stos książek na biurku. Nowe książki układamy na szczycie stosu (ang. Stack top), wtedy stos rośnie w górę

Ze stosu pobieramy książki znajdujące się na samej górze, wtedy stos maleje. Zwróć uwagę, że książki zawsze zdejmujesz ze stosu w kolejności odwrotnej do ich umieszczania – jako pierwszą zdejmiesz ostatnią książkę na stosie.

Wracając do świata komputerów, stos jest taką strukturą danych, z której odczytujemy elementy w kolejności odwrotnej do ich wstawiania. Struktura ta nosi nazwę LIFO (ang. Last In – First Out – wszedł ostatni, a wyszedł pierwszy).
Stosy możemy realizować za pomocą tablic lub list jednokierunkowych. Realizacja tablicowa jest bardzo prosta i szybka. Stosujemy ją wtedy, gdy dokładnie wiemy, ile maksymalnie elementów będzie przechowywał stos – jest to potrzebne do przygotowania odpowiednio pojemnej tablicy na elementy stosu. Realizacja za pomocą listy jednokierunkowej jest przydatna wtedy, gdy nie znamy dokładnego rozmiaru stosu – listy dostosowują się dobrze do obszarów wolnej pamięci.
Do utworzenia stosu w tablicy potrzebujemy dwóch zmiennych. Pierwszą z nich będzie tablica S, która przechowuje umieszczone na stosie elementy. Druga zmienna sptr służy do zapamiętywania pozycji szczytu stosu i nosi nazwę wskaźnika stosu (ang. Stack pointer). Umawiamy się, że wskaźnik stosu zawsze będzie wskazywał pustą komórkę tablicy, która znajduje się na szczycie stosu:

Po utworzeniu tablicy zmienna sptr musi zawsze być zerowana.
Stos jest pusty, gdy sptr wskazuje początek tablicy, czyli komórkę
o indeksie zero. Ta własność jest wykorzystywana w operacji empty. Stos
jest pełny, gdy sptr ma wartość równą
K01: Jeśli sptr = 0,
to zakończ z wynikiem true
K02: Zakończ z wynikiem false
Pascalfunction empty() : boolean;
begin
if sptr = 0 then
empty := true
else
empty := false;
end; |
bool empty()
{
return !sptr;
} |
BasicFunction empty() As Integer
If sptr = 0 Then _
Return 1
Return 0
End Function |
| Python (dodatek) |
def empty():
return not sptr
|
K01: Jeśli sptr = 0, to zakończ z wynikiem wartość_specjalna K02: Zakończ z wynikiem S[sptr-1]
Pascalfunction top : typ_danych;
begin
if sptr = 0 then
top := wartość_specjalna
else
top := S[sptr-1];
end; |
typ_danych top(void)
{
if(sptr)
return S[sptr-1);
return wartość_specjalna
} |
BasicFunction top() As typ_danych
If sptr = 0 Then _
Return wartość_specjalna
Return S(sptr-1)
End Function |
| Python (dodatek) |
def top():
if sptr:
return s[sptr-1]
return wartość_specjalna
|
K01: Jeśli sptr = n, ; stos jest pełny i nie ma to zakończ ; miejsca na nową wartość K02: S[sptr] ← v ; umieszczamy v na szczycie stosu K03: sptr ← sptr+1 ; nowy szczyt stosu K04: Zakończ
Pascalprocedure push(v : typ_danych);
begin
if sptr < n then
begin
S[sptr] := v;
Inc(sptr);
end;
end; |
void push(typ_danych v)
{
if(sptr < n) S[sptr++] = v;
} |
BasicSub push(v As typ_danych)
If sptr < n Then
S(sptr) = v
sptr += 1
End If
End Sub |
| Python (dodatek) |
def push(v):
if sptr < n:
s[sptr] = v
sptr += 1
|
K01: Jeśli sptr > 0, ; jeśli stos coś zawiera, to sptr ← sptr-1 ; to usuwamy element spod szczytu stosu K02: Zakończ
Pascalprocedure pop;
begin
if sptr > 0 then
dec(sptr);
end; |
void pop(void)
{
if(sptr) sptr--;
} |
BasicSub pop()
If sptr > 0 Then _
sptr -= 1
End Sub |
| Python (dodatek) |
def pop():
if sptr:
sptr -= 1
|
|
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
| Poniższy program przedstawia sposób implementacji stosu w tablicy. Tworzy on obiekt zawierający tablicę liczb całkowitych, wskaźnik stosu oraz metody obsługi tej struktury. Rozmiar tablicy jest określany przy tworzeniu obiektu. Na stosie zostaje zapisanych 10 liczb, a następnie są one odczytywane i wyświetlane. |
Pascal// Stos w tablicy
// Data: 13.08.2012
// (C)2020 mgr Jerzy Wałaszek
//------------------------------
program arrStack;
type
Tinteger = array of integer;
// Definicja typu obiektowego Stack
//---------------------------------
Stack = object
private
n : integer; // rozmiar tablicy
sptr : integer; // wskaźnik stosu
S : Tinteger; // tablica dynamiczna
public
constructor init(x : integer);
destructor destroy;
function empty : boolean;
function top : integer;
procedure push(v : integer);
procedure pop;
end;
//---------------------
// Metody obiektu Stack
//---------------------
// Konstruktor-tworzy tablicę dla stosu
//---------------------------------------
constructor Stack.init(x : integer);
begin
n := x;
SetLength(S, x);
sptr := 0;
end;
// Destruktor-zwalnia tablicę dynamiczną
//----------------------------------------
destructor Stack.destroy;
begin
SetLength(S, 0);
end;
// Sprawdza, czy stos jest pusty
//------------------------------
function Stack.empty : boolean;
begin
if sptr = 0 then
empty := true
else
empty := false;
end;
// Zwraca szczyt stosu.
// Wartość specjalna to -MAXINT
//-----------------------------
function Stack.top : integer;
begin
if sptr = 0 then
top := -MAXINT
else
top := S[sptr-1];
end;
// Zapisuje na stos
//-----------------
procedure Stack.push(v : integer);
begin
if sptr < n then
begin
S[sptr] := v;
Inc(sptr);
end;
end;
// Usuwa ze stosu
//---------------
procedure Stack.pop;
begin
if sptr > 0 then
dec(sptr);
end;
//---------------
// Program główny
//---------------
var
S : Stack;
i : integer;
begin
S.init(10);
for i := 1 to 10 do
S.push(i);
while not S.empty do
begin
writeln(S.top);
S.pop;
end;
S.destroy;
end.
|
// Stos w tablicy
// Data: 13.08.2012
// (C)2020 mgr Jerzy Wałaszek
//---------------------------
#include <iostream>
using namespace std;
const int MAXINT = -2147483647;
// Definicja typu obiektowego Stack
//---------------------------------
class Stack
{
private:
int n; // rozmiar tablicy
int sptr; // wskaźnik stosu
int * S; // tablica dynamiczna
public:
Stack(int x); // konstruktor
~Stack(); // destruktor
bool empty (void);
int top(void);
void push(int v);
void pop(void);
};
//---------------------
// Metody obiektu Stack
//---------------------
// Konstruktor-tworzy tablicę dla stosu
//---------------------------------------
Stack::Stack(int x)
{
n = x;
S = new int[x];
sptr = 0;
}
// Destruktor-zwalnia tablicę dynamiczną
//----------------------------------------
Stack::~Stack()
{
delete [] S;
}
// Sprawdza, czy stos jest pusty
//------------------------------
bool Stack::empty(void)
{
return !sptr;
}
// Zwraca szczyt stosu.
// Wartość specjalna to -MAXINT
//-----------------------------
int Stack::top(void)
{
if(sptr)
return S[sptr-1];
return -MAXINT;
}
// Zapisuje na stos
//-----------------
void Stack::push(int v)
{
if(sptr < n)
S[sptr++] = v;
}
// Usuwa ze stosu
//---------------
void Stack::pop(void)
{
if(sptr)
sptr--;
}
//---------------
// Program główny
//---------------
int main()
{
Stack S(10); // tworzymy stos na 10 elementów
int i;
for(i = 1; i <= 10; i++)
S.push(i);
while(!S.empty())
{
cout << S.top() << endl;
S.pop();
}
}
|
Basic' Stos w tablicy
' Data: 13.08.2012
' (C)2020 mgr Jerzy Wałaszek
'---------------------------
Const MAXINT = 2147483647
' Definicja typu obiektowego Stack
'---------------------------------
Type Stack
Private:
n As Integer ' rozmiar tablicy
sptr As Integer ' wskaźnik stosu
Stk As Integer Ptr ' tablica dynamiczna
Public:
Declare Constructor(ByVal x As Integer)
Declare Destructor()
Declare Function empty() As Integer
Declare Function top As Integer
Declare Sub push(ByVal v As Integer)
Declare Sub pop()
End Type
'---------------
' Program główny
'---------------
Dim S As Stack = 10
Dim i As Integer
For i = 1 To 10
S.push (i)
Next
While S.empty() = 0
Print S.top()
S.pop()
Wend
End
'---------------------
' Metody obiektu Stack
'---------------------
' Konstruktor-tworzy tablicę dla stosu
'---------------------------------------
Constructor Stack(ByVal x As Integer)
n = x
Stk = New Integer[x]
sptr = 0
End Constructor
' Destruktor-zwalnia tablicę dynamiczną
'----------------------------------------
Destructor Stack()
Delete [] Stk
End Destructor
' Sprawdza, czy stos jest pusty
'------------------------------
Function Stack.empty() As Integer
If sptr = 0 Then _
Return 1
Return 0
End Function
' Zwraca szczyt stosu.
' Wartość specjalna to -MAXINT
'-----------------------------
Function Stack.top() As Integer
If sptr = 0 Then _
Return -MAXINT
Return Stk[sptr-1]
End Function
' Zapisuje na stos
'-----------------
Sub Stack.push(ByVal v As Integer)
If sptr < n Then
Stk[sptr] = v
sptr += 1
End If
End Sub
' Usuwa ze stosu
'---------------
Sub Stack.pop()
If sptr > 0 Then _
sptr -= 1
End Sub
|
| Python (dodatek) |
# Stos w tablicy
# Data: 08.06.2024
# (C)2024 mgr Jerzy Wałaszek
#---------------------------
MAXINT = -2147483647
# Definicja typu obiektowego Stack
class Stack:
# Konstruktor-tworzy tablicę dla stosu
def __init__(self, x):
self.n = x
self.s = [0] * x
self.sptr = 0
# Destruktor-zwalnia tablicę dynamiczną
def __del__(self):
self.s = None
# Sprawdza, czy stos jest pusty
def empty(self):
return not self.sptr
# Zwraca szczyt stosu
# Wartość specjalna to -MAXINT
def top(self):
if self.sptr:
return self.s[self.sptr-1]
return -MAXINT
# Zapisuje na stos
def push(self, v):
if self.sptr < self.n:
self.s[self.sptr] = v
self.sptr += 1
# Usuwa ze stosu
def pop(self):
if self.sptr:
self.sptr -= 1
#---------------
# Program główny
#---------------
# Tworzymy stos na 10 elementów
s = Stack(10)
for i in range(10):
s.push(i+1)
while not s.empty():
print(s.top())
s.pop()
|
| Wynik: |
10 9 8 7 6 5 4 3 2 1 |
Do realizacji stosu możemy w prosty sposób wykorzystać listę jednokierunkową.
Zapis na stos będzie wtedy polegał na umieszczaniu elementu na początku listy.
Szczyt stosu będzie pierwszym elementem listy. Odczyt ze stosu będzie równoważny
odczytowi pierwszego elementu listy, a usunięcie ze stosu będzie odpowiadało
usunięciu elementu z początku listy. Realizacja listowa jest szczególnie wygodna
wtedy, gdy nie znamy maksymalnego rozmiaru stosu
Każdy element listy jest następującą strukturą danych:
Pascaltype
PSLel = ^SLel;
SLel = record
next : PSLel;
Data: typ_danych;
end; |
struct SLel
{
SLel * next;
typ_danych data;
}; |
BasicType SLel next As SLel Ptr data As typ_danych End Type |
| Python (dodatek) |
class SLel:
def __init__(self, data):
self.next = None
self.data = data
|
Do obsługi listy potrzebujemy wskaźnika, który wskazuje jej początek, czyli pierwszy element listy. Zdefiniujmy go następująco:
Pascal… var sptr : PSLel; … |
… SLel * sptr; … |
Basic… Dim sptr As SLel Ptr … |
| Python (dodatek) |
class Stack:
def __init__(self):
self.sptr = None
|
Przed pierwszym użyciem wskaźnik sptr musi być odpowiednio wyzerowany (w Pythonie robi to automatycznie konstruktor klasy Stack):
Pascal… sptr := NIL; … |
… sptr = NULL; … |
Basic… sptr = 0 … |
K01: Jeśli sptr = nil, ; jeśli sptr nie wskazuje elementu listy, to zakończ z wynikiem true ; to stos jest pusty K02: Zakończ z wynikiem false
Pascalfunction empty(sptr : PSLel) : boolean; begin if sptr = nil then empty := true else empty := false; end; |
bool empty(SLel * sptr)
{
return !sptr;
} |
BasicFunction empty(sptr As SLel Ptr_
As Integer
If sptr = 0 Then _
Return 1
Return 0
End Function |
| Python (dodatek) |
# klasa elementu listy
class SLel:
def __init__(self, data):
self.next = None
self.data = data
# klasa stosu
class Stack:
# Konstruktor
def __init__(self):
self.sptr = None
# Spradza, czy stos pusty
def empty(self):
return not self.sptr
|
K01: Jeśli sptr = nil, to zakończ zwracając wartość_specjalną K02: Zakończ z wynikiem sptr→data
Pascalfunction top(sptr : PSLel)
: typ_danych;
begin
if sptr = nil then
top = wartość_specjalna
else
top := sptr^.data;
end; |
slist * top (SLel * sptr)
{
if(sptr) return sptr->data;
else return wartość_specjalna;
} |
BasicFunction top(sptr As SLel Ptr)_
As typ_danych
If sptr Then
Return sptr->data
Else
Return wartość_specjalna
End If
End Function |
| Python (dodatek) |
# klasa elementu listy
class SLel:
def __init__(self, data):
self.next = None
self.data = data
# klasa stosu
class Stack:
# Konstruktor
def __init__(self):
self.sptr = None
# Zwraca daną ze szczytu stosu
def top(self):
if self.sptr:
return self.sptr.data
else:
return wartość_specjalna
|
K01: Utwórz element listy i umieść jego adres w e K02: e→data ← v ; dane umieszczamy w polu data K03: e→next ← sptr ; następnikiem będzie bieżący szczyt stosu K04: sptr ← e ; szczytem stosu staje się dodany element K05: Zakończ
Pascalprocedure push(var sptr : PSLel;
v : typ_danych);
var
e : PSLel;
begin
new(e);
e^.Data:= v;
e^.next := sptr;
sptr := e;
end; |
void push(SLel * & sptr,
typ_danych v)
{
SLel * e = new SLel;
e->data = v;
e->next = sptr;
sptr = e;
} |
BasicSub push(ByRef sptr As SLel Ptr, _
ByVal v As typ_danych)
Dim e As SLel Ptr
e = New SLel
e->data = v
e->next = sptr
sptr = e
End Sub |
| Python (dodatek) |
# klasa elementu listy
class SLel:
def __init__(self, data):
self.next = None
self.data = data
# klasa stosu
class Stack:
# Konstruktor
def __init__(self):
self.sptr = None
# Umieszcza daną na szczycie stosu
def push(self, v):
e = SLel(v)
e.next = self.sptr
self.sptr = e
|
K01: Jeśli sptr = nil, ; stos jest pusty to zakończ K02: e ← sptr ; zapamiętujemy szczyt stosu K03 sptr ← sptr→next ; usuwamy ze stosu bieżący szczyt K04: Usuń z pamięci element wskazany przez e K05: Zakończ
Pascalprocedure pop(var sptr : PSLel);
var
e : PSLel;
begin
if sptr <> nil then
begin
e := sptr;
sptr := sptr^.next;
dispose(e);
end
end; |
void pop(SLel * & sptr)
{
if(p)
{
SLel * e = sptr;
sptr = sptr->next;
delete e;
}
} |
BasicSub pop(ByRef sptr as SLel Ptr)
Dim e As SLel Ptr
If sptr Then
e = sptr
sptr = sptr->next
Delete e
End If
End Sub |
| Python (dodatek) |
# klasa elementu listy
class SLel:
def __init__(self, data):
self.next = None
self.data = data
# klasa stosu
class Stack:
# Konstruktor
def __init__(self):
self.sptr = None
# Usuwa daną ze szczytu stosu
def pop(self):
if self.sptr:
self.sptr = self.sptr.next
|
|
Uwaga:
Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
| Poniższy program przedstawia sposób implementacji stosu za pomocą listy jednokierunkowej. Tworzy on obiekt zawierający pustą listę liczb całkowitych oraz metody obsługi tej struktury. Na stosie zostaje zapisanych 10 liczb, a następnie są one odczytywane i wyświetlane. |
Pascal// Stos na liście jednokierunkowej
// Data: 13.08.2012
// (C)2020 mgr Jerzy Wałaszek
//------------------------------
program slist_Stack;
// Wartość specjalna
//------------------
const SV = -maxint;
// Typ elementów listy
//--------------------
type
PSLel = ^SLel;
SLel = record
next : PSLel;
Data: integer;
end;
// Definicja typu obiektowego Stack
//---------------------------------
Stack = object
private
sptr : PSLel; // lista przechowująca stos
public
constructor init;
destructor destroy;
function empty : boolean;
function top : integer;
procedure push(v : integer);
procedure pop;
end;
//---------------------
// Metody obiektu slist
//---------------------
// Konstruktor
//------------
constructor Stack.init;
begin
sptr := nil;
end;
// Destruktor
//-----------
destructor Stack.destroy;
begin
while sptr <> nil do
pop;
end;
// Sprawdza, czy stos jest pusty
//------------------------------
function Stack.empty : boolean;
begin
if sptr = nil then
empty := true
else
empty := false;
end;
// Zwraca wartość ze szczytu stosu
//----------------------------------
function Stack.top : integer;
begin
if sptr = NIL then
top := SV
else
top := sptr^.data;
end;
// Umieszcza dane na stosie
//-------------------------
procedure Stack.push (v : integer);
var
e : PSLel;
begin
new (e);
e^.Data:= v;
e^.next := sptr;
sptr := e;
end;
// Usuwa dane ze stosu
//--------------------
procedure Stack.pop;
var
e :PSLel;
begin
if sptr <> NIL then
begin
e := sptr;
sptr := sptr^.next;
dispose (e);
end;
end;
//---------------
// Program główny
//---------------
var
S : Stack;
i : integer;
begin
S.init;
for i := 1 to 10 do S.push (i);
while not S.empty do
begin
writeln(S.top);
S.pop;
end;
S.destroy;
end.
|
// Stos na liście jednokierunkowej
// Data: 13.08.2012
// (C)2020 mgr Jerzy Wałaszek
//------------------------------
#include <iostream>
using namespace std;
// Wartość specjalna
//------------------
const int SV = -INT_MAX;
// Definicja typu obiektowego Stack
//---------------------------------
struct SLel
{
SLel * next;
int data;
};
class Stack
{
private:
SLel * sptr; // lista przechowująca stos
public:
Stack(); // konstruktor
~Stack(); // destruktor
bool empty(void);
int top(void);
void push(int v);
void pop(void);
};
//---------------------
// Metody obiektu Stack
//---------------------
// Konstruktor
//------------
Stack::Stack()
{
sptr = NULL;
}
// Destruktor-zwalnia tablicę dynamiczną
//----------------------------------------
Stack::~Stack()
{
while(sptr)
pop();
}
// Sprawdza, czy stos jest pusty
//------------------------------
bool Stack::empty(void)
{
return !sptr;
}
// Zwraca szczyt stosu
//--------------------
int Stack::top(void)
{
if(sptr) return
sptr->data;
return SV;
}
// Zapisuje na stos
//-----------------
void Stack::push(int v)
{
SLel * e = new SLel;
e->data = v;
e->next = sptr;
sptr = e;
}
// Usuwa ze stosu
//---------------
void Stack::pop(void)
{
if(sptr)
{
SLel * e = sptr;
sptr = sptr->next;
delete e;
}
}
//---------------
// Program główny
//---------------
int main()
{
Stack S;
int i;
for(i = 1; i <= 10; i++)
S.push(i);
while(!S.empty())
{
cout << S.top() << endl;
S.pop();
}
}
|
Basic' Stos na liście jednokierunkowej
' Data: 13.08.2012
' (C)2020 mgr Jerzy Wałaszek
'------------------------------
' Wartość specjalna
'------------------
Const SV = -2147483647
' Definicja typu obiektowego Stack
'---------------------------------
Type SLel
next As SLel Ptr
data As Integer
End Type
Type Stack
Private:
sptr As SLel Ptr ' lista zawierająca stos
Public:
Declare Constructor()
Declare Destructor()
Declare Function empty() As Integer
Declare Function top() As Integer
Declare Sub push(ByVal v As Integer)
Declare Sub pop()
End Type
'---------------
' Program główny
'---------------
Dim S As Stack
Dim i As Integer
For i = 1 To 10
S.push(i)
Next
While S.empty() = 0
Print S.top()
S.pop()
Wend
End
'---------------------
' Metody obiektu Stack
'---------------------
' Konstruktor
'------------
Constructor Stack()
sptr = 0
End Constructor
' Destruktor
'-----------
Destructor Stack()
While sptr
pop()
Wend
End Destructor
' Sprawdza, czy stos jest pusty
'------------------------------
Function Stack.empty() As Integer
If sptr = 0 Then _
Return 1
Return 0
End Function
' Zwraca szczyt stosu.
'------------------------------
Function Stack.top() As Integer
If sptr = 0 Then
top = SV
Else
top = sptr->data
End If
End Function
' Zapisuje na stos
'-----------------
Sub Stack.push(ByVal v As Integer)
Dim e As SLel Ptr
e = New SLel
e->Data = v
e->Next = sptr
sptr = e
End Sub
' Usuwa ze stosu
'---------------
Sub Stack.pop()
Dim e As SLel Ptr
If sptr Then
e = sptr
sptr = sptr->Next
Delete e
End If
End Sub
|
| Python (dodatek) |
# Stos na liście jednokierunkowej
# Data: 09.06.2024
# (C)2024 mgr Jerzy Wałaszek
#------------------------------
# Wartość specjalna
SV = -2147483648
# Definicja typu obiektowego Stack
#---------------------------------
class SLel:
# Konstruktor
def __init__(self, v):
self.next = None
self.data = v
class Stack:
# Konstruktor
def __init__(self):
self.sptr = None
# Destruktor
def __del__(self):
while self.sptr:
self.pop()
# Sprawdza, czy stos jest pusty
def empty(self):
return not self.sptr
# Zwraca szczyt stosu
def top(self):
if self.sptr:
return self.sptr.data
else:
return SV
# Zapisuje na stos
def push(self, v):
e = SLel(v)
e.next = self.sptr
self.sptr = e
# Usuwa ze stosu
def pop(self):
if self.sptr:
self.sptr = self.sptr.next
#---------------
# Program główny
#---------------
s = Stack()
for i in range(1, 11):
s.push(i)
while not s.empty():
print(s.top())
s.pop()
|
| Wynik: |
10 9 8 7 6 5 4 3 2 1 |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.