Documente Academic
Documente Profesional
Documente Cultură
Stiva
Stiva
Stiva este o list pentru care singurele operaii permise sunt: adugarea unui element n stiv i
eliminarea, consultarea sau modificarea ultimului element introdus n stiv.
Pentru nelegere, ne imaginm o stiv de farfurii. Adugarea sau scoaterea unei farfurii se face cu
uurin, numai din vrful stivei. Dup ce am scos toate farfuriile din stiv spunem c stiva este
vid. Principiul stivei are consecine uriae n programare.
Stivele se pot aloca secvenial (ca vectorii). Fie ST[i] un vector. ST[1], ST[2],...,ST[n] pot reine
numai litere sau cifre. O variabil k indic n permanen vrful stivei, adic ultimul element
introdus.
Exemplu:
A
B
A
x 1, x 12
F x
F (F (x 2)), x 12
1
n situaia n care pentru valoarea aflat pe nivelul k se poate calcula funcia, se coboar n
stiv punndu-se pe acest nivel noua valoare.
10
10
11
11
12
8
13
13
11
11
12
F=11
Programul:
#include<iostream.h>
#include<conio.h>
int st[100],n,k;
void main()
{
clrscr();
cout<<"n=";
cin>>n;
k=1;
st[1]=n;
while (k>0)
if (st[k]<12)
{
k++;
st[k]=st[k-1]+2;
}
else
{
k--;
if(k>0) st[k]=st[k+1]-1;
}
cout<<"n="<<st[1]-1;
getch();
}
Se poate demonstra c pentru valori mai mici dect 12, funcia ia valoarea 11.
Exemplul 2: Funcia lui Ackermann
Se d funcia de mai jos, definit pe produsul cartezian NxN. Se citesc m i n, s se calculeze
Ack(m,n).
2
n 1, m 0
21
02
21
20
21
13
11
21
13
12
10
11
21
01
11
21
11
12
13
10
11
12
13
01
11
02
12
12
03
13
13
13
04
Ack(2,1)=5
Funcia lui Ackermann ia valori extrem de mari pentru valori mici ale lui m i n. De exemplu, nu
vei reui s calculai Ack(4,4).
#include<iostream.h>
#include<conio.h>
int st[10000][2];
void main()
{
int m,n,k;
clrscr();
cout<<"m=";
cin>>m;
cout<<"n=";
cin>>n;
k=1;
st[k][0]=m;
st[k][1]=n;
while (k>0)
if (st[k][0]&&st[k][1])
{
k++;
st[k][0]=st[k-1][0];
st[k][1]=st[k-1][1]-1;
}
else
if(!st[k][1])
{
st[k][0]=st[k][0]-1;
st[k][1]=1;
}
else
{
k--;
if(k>0) st[k][0]=st[k][0]-1;
st[k][1]=st[k+1][1]+1;
}
cout<<"Ack("<<m<<","<<n<<")="<<st[1][1]+1;
getch();
}