Реализация стека в Паскале

Реализация стека в Паскале

Для тех кто не знает, что такое стек: информация на википедии и статья о стеке в С++ .

Теперь перейдем непосредственно к реализации. Храниться стек будет в массиве, самый нижний элемент стека будет находиться в 1 элементе.

var
a : array[1..100] of integer;

Процедура Push (Добавление на вершину стека). Работает так: передвигаем указатель с последнего занятого элемента в массиве(верхнего в стеке) на первый свободный элемент массива (т.е. увеличиваем size на 1). Потом добавляем в эту пустую ячейку новый элемент. Таким образом size вновь указывает на верхний элемент стека.

procedure push(c :integer);
begin
size := size + 1;
a[size] := c;
end;

>

Процедура Pop (Удаление верхнего элемента стека). Просто уменьшаем текущий размер, ничего не делая с последним элементом. Этот последний элемент будет уже как бы вне массива, поэтому мешать не будет.

procedure pop;
begin
size := size — 1;
end;

Функция Top (Получения значения верхнего элемента стека). Т.к. мы знаем индекс элемента, который находится на вершине стека (этот индекс size), то просто возвращаем элемент с данным индексом.

function top : integer;
begin
top := a[size];
end;

Функцию проверки на пустоту отдельно реализовывать не будем. Чтобы проверить пуст ли стек нужно просто сравнить size с 1.

Пример:

var
a : array[1..100] of integer;
size, x, i : integer;

procedure push(c : integer);
begin
size := size + 1;
a[size] := c;
end;

procedure pop;
begin
size := size — 1;
end;

function top : integer;
begin
top := a[size];
end;

begin

size := 0; {Изначально стек пуст}

for i := 1 to 3 do begin {добавляем 3 введенных с клавиатуры элемента. Например 4 16 9}
readln(x);
Push(x);
end;

writeln(Top()); {Верхний элемент — 9. Поэтому на экран будет выведено 9}

while size > 0 do  {Удаляем элементы пока стек не опустеет}
Pop();

writeln(size); {Стек пуст, поэтому выведется 0}

end.

5 комментариев

  • Айнура

    Ответить 06.01.2012 18:12

    спасибо!! очень помогло

  • ыавэанпоргжлд

    Ответить 24.03.2013 19:13

    это не стек.
    здесь я могу получить доступ к любому элементу,а в стеке только к крайнему.

  • Topcoder

    Ответить 27.03.2013 19:15

    При помощи реализованных функций можно получить доступ как раз таки только к последнему элементу. Так что это стек.

  • программюга

    Ответить 04.02.2014 19:16

    в ассемблере я тоже могу получить доступ к любому элементу стека, так что это стек

  • Antonio

    Ответить 09.04.2014 19:17

    Не проходит задача дистанционно на сайте: http://informatics.mccme.ru/mod/statements/view.php?id=207
    подскажите plis, что у меня не так?
    var
    a:array[0..100] of integer;
    b:array[0..10]of integer;
    siz,n,code,k,i,s2,m,t,d,sign : integer;
    s1:string;
    procedure push(n:integer);
    begin
    siz:=siz+1;
    a[siz]:=n;
    write(‘ok’);
    end;
    procedure pop;
    begin
    siz:=siz-1;
    end;
    procedure back;
    begin
    write(a[siz]);
    end;
    procedure size;
    begin
    write(siz);
    end;
    procedure clear;
    begin
    while (siz>0) do siz:=siz-1;
    end;
    procedure ex;
    begin
    write(‘bye’);
    s1:=’q’;
    end;
    begin
    siz:=0;
    repeat
    read(s1);
    sign:=1;
    if (s1[2]=’u’)then begin
    m:=length(s1)-6;
    t:=0;
    for i:=6 to 6+m do begin
    n:=ord(s1[i]);
    if s1[i]=’-‘ then begin sign:=-1; continue end;
    case n of
    48:n:=0;
    49:n:=1;
    50:n:=2;
    51:n:=3;
    52:n:=4;
    53:n:=5;
    54:n:=6;
    55:n:=7;
    56:n:=8;
    57:n:=9
    else begin write(‘error’);exit; end;
    end;
    b[t]:=n;
    t:=t+1;
    end;
    d:=1;s2:=0;
    t:=t-1;
    for i:=t downto 0 do begin
    n:=b[i]*d;
    s2:=s2+n;
    d:=d*10;
    end;
    n:=sign*s2;
    push(n);
    end
    else if s1[2]=’o’ then begin write(a[siz]);pop;end
    else if s1[2]=’a’ then back
    else if s1[2]=’i’ then size
    else if s1[2]=’l’ then begin clear;write(‘ok’);end
    else if s1[2]=’x’ then ex;
    until (s1=’q’);
    end.

Оставить комментарий