В указатель stl помещается число new item
Адрес 2024 Адрес 2026
Блок памяти
ММ........................................ мь!-*.............
new item=2024
info=1200nest=*s
next=NULL
Рис. 1.22
Шаг 7. Строкой программы
's = new item;
где newitem 1.23).
2024, указателю stl присваивается значение адреса стека (рис.
Адрес 65524 |
□
.............. п
stl=2024
Рис. 1.23
Для иллюстрации работы программы построим таблицу (табл. 2.6).
Таблица 2.6
Изменение значений переменных в процессе работы програмы
Адрес stl | Старое значение stl | Новое значение stl | Адрес info | Адрес next | Значение info | Значение next |
NULL | NULL | |||||
Графическое представление работы программы представлено на рис. 1.24.
Функция pop. Параметрами функции pop являются: a) s — указатель на указатель на структуру типа stack, б) указатель error на переменную типа int. Функция возвращает значение типа int (значение переменной oldinfo). Объект old item — указатель на старый элемент стека, которому присваивается значение указателя s.
Рассмотрим пошагово работу функции pop.
Шаг 1. Объявляется указатель на структуру типа stack (STACK *stl;).
Шаг 2. С помощью функции push в стек помещаются числа 1200, 13, 125.
info next | info next | info next | ||
1200 | 0 | 13 | 2202 | -* | 125 | 2210 | |
ч* |
t
stl........
push(&stl,1200)
t
.... >stl.........
push(&stl,13)
t
.... ->stl
push(&stl?125)
Графическое представление стека
St1 | info | next | info | next | |||
& | <w | V | |||||
^ | —^ |
info | next |
Рис. 1.24 Шаг З. Из стека выталкиваются элементы. Вызывается функция
pop(&st\, Scerror) .
В качестве аргументов функции используются: адрес указателя st\ и адрес переменной error.
Шаг 4. В теле функции pop объявляется указатель на структуру типа stack (имя указателя old item). Указателю old item присваивается значение указателя s:
STACK *old_item = *s; ,
т. е. переменной old item присваивается адрес верхнего элемента стека (рис. 2.25).
Значение | |
Л | " |
1 1 1 М.............. 1X1...................... IXMXM 1 1 1 | |
old_item=stl; SU ^° nest Верхний элемент стека |
Рис. 1.25
Шаг 5. Если значение *s (т. е. stX) не равно 0, то выполняются следующие действия:
1. Строка
old info = old item -> info.
Переменной old info присваивается значение верхнего элемента стека.
2. Строка
*s = (*s) -> next.
Указатель st\ передвигается на следующий узел.
3. С помощью строки
free( old item );
освобождается блок памяти, на который указывает old item (т.е. удаляется узел). На рис. 1.26 приведена иллюстрация работы функции pop на 5-м шаге.
ч* info пай | info | next | **--■,■ *ь | info | next | ||||
> | *ь | а | NULL | ||||||
С * | р | ^ ■ ^ | |||||||
X \ stl------------------ | -------------- > | "3 stl | ^ | ||||||
Рис. 1.26
Шаг 6. Если значение указателя st\ равно 0, то переменной error присваивается значение 1. (Переменная error сигнализирует об ошибках при работе со стеком. Если error = 1, то произошла ошибка. Если error = 0, то ошибки нет.)
Шаг 7. Функция возвращает значение переменной old info (т. е. функция возвращает число, вытолкнутое из стека). Если операция pop выполнена успешно, то error = 0, в противном случае error = 1.
Функция реек. Параметрами данной функции являются: a) &st\ — адрес указателя st\ (т. е. адрес указателя, хранящего адрес стека), б) &error — адрес переменной error. Функция возвращает значение типа int.
Если значение указателя stl не равно NULL, то переменной error присваивается значение 0, и функция возвращает значение верхнего элемента стека (значение переменной info).
Если значение указателя st\ равно NULL, то переменной error присваивается значение 1, и функция возвращает значение 0. (Если в стеке не менее одного элемента, то error = 0; если в стеке нет элементов, то error = 1.)