Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП Технология программирования.doc
Скачиваний:
20
Добавлен:
11.06.2015
Размер:
1.69 Mб
Скачать

Понятие стека. Функции для стека

Стеком называется последовательность элементов, в которой добавлять и удалять можно только первый элемент. Первый элемент называется верхним, потому что английское stack означает кипу бумаг или штабель дров, где класть и брать можно только сверху. Другое название стека – магазин, по аналогии с магазином многозарядной винтовки или автомата, в котором пули заталкиваются и выталкиваются с одного конца. Популярность такой структуры проявляется в том, что для неё часто используется специальная аббревиатура LIFO (Last In – First Out, Последний войдёшь – первый выйдешь) или FILO (Первый войдёшь – последний выйдешь).

Программный стек хорошо реализуется односвязным списком, в котором вершина стека является головой списка. Стандартный набор операций для стека:

push – втолкнуть новый элемент в стек, протолкнуть пулю в магазин;

pop – вытолкнуть (удалить) элемент из стека, как пробку из бутылки;

top – скопировать верхний элемент стека, не удаляя его;

exchange – поменять местами два верхних элемента стека;

empty – проверить, пуст ли стек.

При желании этот набор можно расширить. Приведём функции, реализующие эти операции. В них Р – дескриптор списка, представляющего стека Е – новый элемент со свойством next.

function push(E, P)

{insAfter(E, P)

};

function pop(P) //выдаёт ссылку на удалённый элемент

{delNext(P)

};

function top(P) //выдаёт info верхнего элемента

//или null, если стек пуст

{if (P.next == null) return null;

return P.next.info

};

function exchange(P)

{if (P.next!=null && P.next.next!=null)

{var x = P.next.next;

P.next.next = x.next;

x.next = P.next;

P.next = x

}};

function empty(P)

{return (P.next == null)

}

Двухсвязный список, его структура

Двухсвязным называется список, в котором каждый элемент содержит ссылку next на следующий элемент и ссылку pred на предыдущий элемент. Структура двухсвязного списка представлена на рис. 9 (серым цветом выделен дескриптор списка).

Рис. 9. Представление списка (е1, е2, … еn) и пустого списка ( ).

Последний элемент списка не имеет следующего (next равно null), а первый – предыдущего (pred равно null). Дескриптором списка является запись с двумя полями next (ссылка на первый элемент списка) и last (ссылка на последний элемент списка). Обе ссылки равны null для пустого списка.

Одним литералом двухсвязный список записать невозможно. Но следующий простой код показывает, как построить двухсвязный список для конкретной последовательности. Построим список для последовательности (1, 2, 3):

x1={info:1, pred:null};

x2={info:2, pred:x1};

x3={info:3, pred:x2, next:null};

x1.next=x2; x2.next=x3;

d={next:x1, last:x3} //дескриптор списка

К двухсвязному списку можно применять все функции для работы с односвязными списками и стеками, но при удалении и вставке элементов структура ссылок pred и last нарушается. Поэтому для сохранения структуры двухсвязного списка соответствующие функции нуждаются в доработке.

function insAfter2(E,P,D) //D – дескриптор списка

{P.next = {info:E, next:P.next};

if (D == P) //вставка перед первым элементом

P.next.pred = null

else P.next.pred = P;

if (P.next.next != null) //E не последний

P.next.next.pred = P.next

else D.last = P.next //E последний

};

function delNext2(P, D)

{var r = P.next;

if (P.next != null) P.next = P.next.next;

if (P.next != null) P.next.pred = r.pred

else D.last = r.pred;

return r

};

function toList2(A)

{var r={next:null, last:null}, //дескриптор пустого списка

P=r;

for (var i=0; i<A.length; i++)

{insAfter2(A[i],P,r);

P = P.next};

return r

}