Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Статическая реализация стеков

Словарный порядок на последовательностях произвольной длины

c1…ck < c1|…c|L, т.е. $ i0 (ci0<ci0| and "i<i0 (ci=c|I) or ("i (ci=ci|) and k<L)

Технический приём: дополнить меньшее слово фиктивным элементом, например пробелом, наименьшим по определению.

можно:=false;

pаскраска:=Первая раскраска; {<первый цвет>}

while (не кончилась раскраска) do

begin

{Пустая раскраска – последовательность длины 0}

if правильная (раскраска) then if полная (раскраска) then

begin

можно:=true {печать (раскраска)}

else {раскраска правильная, но не полная}

{дополнить} раскраска:=раскраска + первый цвет

else {возврат} раскраска:=succ(раскраска);

end;

end;

Переход к следующей раскраске при новом определении словарного порядка:

1) Выбрасывать все последние значения с конца последовательности до тех пор, пока не выкинем первый элемент, у которого есть следующий. Если такого нет, то раскраска кончилась.

2) Если раскраски не кончились, возвратить следующий за последним, выкинутым в раскраску.

Последовательность, из конца которой можно выкидывать и в конец которой можно добавлять элементы, называется стеком (stack).

Стеком называется абстрактный тип данных, множеством значений которого является множество всех последовательностей произвольной длины (динамический тип) элементов некоторого базового типа Т со следующими операциями:

1) Push ([x:tStack], y:T), х – имя стека, затолкнуть y в стек.

Семантика: x:=x+y (добавление элементов в конец последовательности)

2) Pop ([x:tStack],y:T), x – имя стека, извлечь y из стека.

if x=c1…cn then pop=cn. Длина стека уменьшается на 1: x=c1…cn-1.

Попытка взять элемент из пустого стека считается ошибкой.

3) Empty ([x:tStack]):boolean; – стек пуст.

if Empty([x:tStack]){=true} then {длина стека равна нулю}.

4) Характерные для динамических типов операции Create([x:tStack]) и Destroy([x:tStack]) рассмотрим позднее.

Стеки также называют «магазинной» памятью.

Переход к следующей раскраске, если такой нет, то к пустой.

 

procedure Новая (var раскраска:tStack);

var x:tЦвет;

Begin

pop(stack,x);

while not empty(stack) and (x=последний цвет) do pop(stack,x);

if not empty(stack) then push(succ(x));

End;

 

Дополнить раскраску=push(stack,первый цвет)

Кончились раскраски – empty(stack)

Упражнение. Завершить реализацию перебора с возвратом, написав процедуру «Правильная».

c1…ck+1 – правильная, то c1…сk – правильная.

"iÎ[1,k] (соседи(ck,ck+1))

раскраска(1)¹раскраска(k+1)

(Выходим за пределы стековых операций).

 

Стек – динамический тип данных – количество элементов, которое можно положить в стек, не ограничено (в идеале), но во многих случаях, в том числе в задаче о раскраске карты, известна максимальная глубина стека, то есть стек можно понимать статически. Стандартный приём оперировать с такими типами (абстрактными, но статическими) – моделировать их массивами и переменными стандартных типов.

 

 

top heap

¯ ¯ nMax

  Куча

 

type index=1..nMax{ };

T={базовый тип стека};

tStack= record

content:array[index] of T;

heap:index;{указатель на начало «кучи», первую свободную компоненту массива}

end;

 

 

procedure push(var stack:tStack;x:T);

begin

with Stack do

begin

content[heap]:=x;

inc(heap);

end;

end;

Реализация не защищена от ошибки – переполнения стека. Предполагается, что ситуацию контролирует пользователь.

 

procedure pop(stack:tStack;var x:T);

begin

with stack do

begin

dec(heap);

x:=content[heap];

end;

end;

Снова незащищённая реализация: контроль за пустотой стека возлагается на пользователя.

 

function empty(stack:tStack):boolean;

begin

empty:=stack.heap=1;

end;

 

procedure init(stack:tStack);{инициализация стека}

begin

stack.heap:=1;

end;

 

// финализация? – возврат в начальное состояние

 

<== предыдущая лекция | следующая лекция ==>
Как сократить перебор с возвратом. Перечисление последовательностей переменной длины | Статическая реализация деревьев
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 392; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.