русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Очередь, реализованная с помощью массива


Дата добавления: 2013-12-23; просмотров: 1452; Нарушение авторских прав


В этом случае для хранения значений элементов очереди используется массив размерностью SizeQueue. Необходимо еще два указателя: Голова, указывающая на первый элемент в очереди, и Хвост — на элемент массива, в который можно поместить очередное значение. Если очередь пуста, то Голова и Хвост указывают на один и тот же элемент массива. Поскольку в процессе работы при помещении значений в очередь массив заполняется с правой стороны, а при извлечении из очереди — освобождается слева, то имеет смысл сделать массив кольцевым. Это означает, что когда значение помещается в последний элемент массива, указатель Хвост перемещается к первому элементу массива (аналогично для Головы). Таким образом, Хвост может быть левее Головы.

Очередь пуста — это значит, что в массиве не содержится ни одного значения. Очередь может стать пустой в процессе работы, при этом Голова и Хвост будут указывать на один и тот же элемент, но не обязательно на первый элемент массива. Поэтому для проверки очереди на пустоту необходим еще счетчик элементов очереди, который равен нулю, если очередь пуста, и имеет значение SizeQueue, если очередь забита полностью.

В листинге 9.18 приведен модуль работы с очередью, реализованной с помощью массива.

Листинг 9.18. Очередь, реализованная с помощью массива

const

SizeQueue=6; // размер очереди

type

Index = 0..SizeQueue-1;

TInfo = integer;

TQu = array[0..SizeQueue-1] of TInfo;

TQueue=record

Head, // указатель на голову очереди

Tail : Index; // указатель на хвост очереди

Queue: TQu; // очередь

full : integer; // количество элементов в очереди

end;

 

procedure InitQueue(var q:TQueue);

//инициализация очереди: голова и хвост совпадают, элементов нет

begin

with q do begin

Head:=0; Tail:=0; full:=0;

end;

end;

 

function QueueIsEmpty(q:TQueue): Boolean;



// проверка очереди на пустоту

begin

Result:=q.full=0;

end;

 

procedure InQueue(var q:TQueue; x:TInfo);

// добавление в очередь:

// Tail указывает на элемент в массиве, куда поместить

begin

with q do begin

Queue[Tail]:=x; full:=full+1;

Tail:=(Tail+1) mod SizeQueue // переход к следующему

// элементу с учетом кольца

end

end;

 

function OutQueue(var q:TQueue): TInfo;

// взять из очереди: Head указывает на элемент, который брать

begin

with q do begin

Result:=Queue[Head]; full:=full-1;

Head:=(Head+1)mod SizeQueue // смещение головы очереди

// с учетом кольца

end;

end;

Теперь создадим проект, иллюстрирующий работу очереди на массиве. Форма проекта приведена на рис. 9.14.

Рис. 9.14. Форма для иллюстрации очереди, реализованной с помощью массива

На форме выставлены компоненты:

q компонент Edit для ввода целого значения;

q кнопка В очередь; помещающая число в очередь;

q компонент StringGrid, в верхней строке которого отображается содержимое очереди, а в нижней показаны положения указателей очереди. Если очередь пуста, то указатели показывают на одну и ту же ячейку;

q компонент Memo, в которое выводятся значения, взятые из очереди;

q кнопка Из очереди, при нажатии на которую из очереди берется элемент и выводится в поле Memo;

q кнопка Очистить, очищающая ячейки StringGrid и инициализирующая очередь для новой работы.

q Рассмотрим обработчики событий при работе с формой Очередь.

q Обработчик события Click кнопки Очистить инициализирует очередь, очищает ячейки таблицы и компоненты Edit и панель вывода:

Листинг 9.19. Инициализация очереди

procedure TFormQueueArr.ButtonInitClick(Sender: TObject);

var

i: integer;

begin

InitQueue(Qu); // инициализация очереди

with StringGridQueue do begin

for i:=0 to SizeQueue do begin

Cells[i,0]:=''; Cells[i,1]:=''

end;

Cells[0,1]:='Глв^Хвст^';

EditIn.Text:=''; EditIn.SetFocus;

Panel1.Caption:='';

end

end;

q Обработчик события Click кнопки В очередь, помещает, если возможно, число в очередь и соответствующим образом меняет информацию в ячейках таблицы:

Листинг 9.20. Добавление в очередь

procedure TFormQueueArr.ButtonInQClick(Sender: TObject);

var s: string;

TOld,t: index;

i: TInfo;

em:Boolean;

begin

if Qu.full=SizeQueue then

ShowMessage('Очередь забита до отказа!')

else begin

s:=EditIn.Text;

if length(s)>0 then begin

i:=StrToInt(s);

TOld:=Qu.Tail;

em:=QueueIsEmpty(Qu); // очередь была пуста

InQueue(Qu,i); // поместили первый элемент

t:=Qu.Tail;

with StringGridQueue do begin

if em then Cells[TOld,1]:='Голова^ '

else Cells[TOld,1]:=' ';

if Qu.Full=SizeQueue then

Cells[t,1]:='Глв^Хвст^'

else Cells[t,1]:='Хвост^';

Cells[TOld,0]:=s;

end;

EditIn.Text:='';

EditIn.SetFocus;

end;

end;

end;

 

q Обработчик события Click кнопки Из очереди, берет, если возможно, число из очереди и соответствующим образом меняет информацию в ячейках таблицы:

Листинг 9.21. Из очереди

procedure TFormQueueArr.ButtonOutQClick(Sender: TObject);

// кнопка Из очереди

var

s: string;

HOld,h, // старая и текущая голова

t : index; // текущий хвост

i : TInfo;

em,fl : Boolean; // признаки пустоты и полноты очереди

// (для расстановки указателей)

begin

if QueueIsEmpty(Qu) then begin

ShowMessage('Очередь пуста!');

EditIn.SetFocus;

end

else begin

s:=Panel1.Caption;

HOld:=Qu.Head;

t:=Qu.Tail;

fl:=Qu.full=SizeQueue;

OutQueue(Qu);

em:=QueueIsEmpty(Qu);

h:=Qu.Head;

with StringGridQueue do begin

s:= s+' '+StringGridQueue.Cells[HOld,0];

Cells[HOld,1]:=' ';

Cells[HOld,0]:=' ';

if em then Cells[h,1]:='Глв^Хвст^'

else Cells[h,1]:='Голова^';

if fl then Cells[t,1]:='Хвост^';

end;

EditIn.Text:='';

EditIn.SetFocus;

Panel1.Caption:=s;

end;

end;

 



<== предыдущая лекция | следующая лекция ==>
Динамическая реализация очереди | Расстановка ферзей


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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