
4. Стек. Абстрактный тип данных стек. Реализация стека с помощью массива.
Стек("последний пришел – первым вышел") - линейный последовательный список, в котором доступ, включение и исключение элементов выполняется только с одного конца: Вершина стека –позиция, в которой находится последний поступивший элемент. Операции над элементами стека (включение и исключение) производятся с его вершины, причем в каждый момент для исключения доступен только верхний (последний) элемент . Операции:
1.создать стек
2.поместить элемент в стек
3.забрать элемент
4.получить значение верхнего элемента
5.проверить на пустоту
6.удалить.
Вершина стека адресуется с помощью специального указателя. Стек считается пустым, если указатель смещен вниз на длину одной ячейки относительно низа стека. При работе со стеком необходимо учитывать, что если в процессе заполнения указатель выйдет за верхнюю границу, то происходит переполнение стека и новый элемент ввести уже невозможно. Для этого перед реализацией стека необходимо указывать его границы.
Представление стека – массивом, содержащим не меньшее число элементов, чем может быть заслано в стек. Для очередного элемента достаточно иметь один указатель t на этот элемент.
Когда стек пуст, t = 0.
Описание:
const MaxStack= 100;
Type TypElem -описание элемента
var stack : array[1..MaxStacks] of TypElem ; integer T;
T=0
Поместить новый элемент(Push(y)):
1)t = t + 1;указатель перемещается "вверх" на длину слота или ячейки;
2)stack[t] = y; по значению указателя в стек помещается информация о новом элементе.
Чтобы добавить элемент в стек, нужно увеличить значение указателя на единицу, а затем занести в элемент массива с индексом t информацию из y:
Забрать элемент(Pop(y)):
1)y = stack[t];прочитывается информация об исключаемом элементе по значению указателя;
2)t = t - 1;затем указатель смещается "вниз" на один слот.
Получить знач. верхнего э-та(Top(y)): y=stack[t]
Проверка на пустоту IsEmpty: if t = 0 then return true
else return false
При этом следует помнить, что t не может быть меньше 1 и больше MaxStack. Следовательно, нужны проверки на пустоту и переполнение стека.
Извлекаем:
if t = 0 then обрабатываем пустой стек else y := stack[t]; t := t - 1;
Добавляем:
if t = MaxStack then обрабатываем переполненный стек else t := t + 1; stack[t] := y ;
Затраты постоянные О(1)-делается все за одну итерацию Недостаткипроверка на переполнение.