- •Динамические структуры данных Классификация структур данных
- •Понятие о динамической памяти
- •Адреса и указатели
- •Описание и состояния указателей
- •Работа с указателями в программе
- •Объявление указателя
- •Выделение памяти
- •Работа с информацией (разыменование)
- •Работа с адресом
- •Освобождение памяти
- •Особенности динамических данных
- •Связанные динамические структуры
- •Организация взаимосвязей в связанных динамических данных
- •Основные типы связанных динамических структур
- •Работа с очередью
- •Работа со стеком
- •Создание стека
- •Добавление элемента
- •Удаление элемента стека
Удаление элемента стека
1. Исходное состояние:
-
Val
?
Р
10
?Тор
3
1
5
nil
2. Извлечение информации из информационного поля вершины стека Тор в переменную Val и установка на вершину стека вспомогательного указателя Р
-
Val
10
Val := Top^.Inf;
Р10
P := Top;
Тор
3
1
5
nil
3. Перемещение указателя вершины стека Тор на следующий элемент и освобождение памяти, занимаемой «старой» вершиной стека.
-
Val
10
Top := P^.Link;
Р
Dispose(P);
Тор
3
1
5
nil
В качестве примера использования структуры стек для решения задач рассмотрим программу, реализующую польский калькулятор. Такой калькулятор реализует арифметические выражения, записанные в постфиксной форме. В выражение могут входить цифр, разделенные запятой, и знаки четырех арифметических операций (+ - * / ). В постфиксной форме сначала записываются операнды, затем знак математической операции. Примеры:
-
Обычная запись
Постфиксная запись
3+4
3,4+
(5-4)+2
5,4-2+
2*(3+4)*5
2,3,4+*5*
Pascal:
Uses crt;
Type stack = ^stacint;
Stackint = record
Dt:integer;
Pt:stack;
End;
Var beg_st:stack;
i:integer;
x,y,k,z:integer;
s:string;
Procedure addstack(x:integer);
Var
Temp:stack;
Begin
New(temp);
Temp^.dt := x;
Temp^.pt := beg_st;
Beg_st := temp;
End;
Procedure del_st(var x:integer);
Var temp: stack;
Begin
X := beg_st^.dt;
Temp := beg_st;
Beg_st := beg_st^.pt;
Dispose(temp);
End;
Begin
Clrscr;
Readln(s);
Beg_st := nil;
Val(s[1],x,k);
Addstack(x);
For i:=2 to length(s) do
Begin
Val(s[i],x,k);
If s[i]<>’,‘ then
case s[i] of
‘+’: begin del_st(y); del_st(z); x:= y+z; addstack(x); end;
‘-’: begin del_st(y); del_st(z); x:= z-y; addstack(x); end;
‘*’: begin del_st(y); del_st(z); x:= y*z; addstack(x); end;
‘/’:begin del_st(y);del_st(z);x:= z div y;addstack(x); end;
else addstack(x);
end;
end;
del_st(x);
writeln(x);
readln;
end.
