Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Реализация стека с помощью массива

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

Кроме массива данных, соответствующих типу данных стека, достаточно иметь одну переменную целого типа для хранения индекса элемента массива, являющегося вершиной стека. При помещении элемента в стек индекс увеличивается, при выборке – уменьшается на единицу.

Очередь

Для работы с очередью определены операции: добавление элемента в очередь и выборка элемента из очереди. При выборке элемент исключается из очереди. Очередь реализует принцип обслуживания FIFO (first in-first out - первым пришел - первым ушел).

В программировании очередь применяется в моделировании, диспетчеризации задач операционной системой, буферизованном вводе-выводе.

Пример. Программа формирует очередь из 5 чисел и выводит их на экран. Функция помещения в конец очереди называется add, а выборки – del. Указатель на начало очереди - pbeg, указатель на конец очереди – pend.

//--------------------------------------------------------------------------------

#include <iostream.h>

struct Node{

int d;

Node* p;

};

Node* first(int d);

void add(Node** pd, int d);

int del(Node** pg);

//----------------------------------------------

void main()

{ Node* pbeg=first(1);

Node* pend=pbeg; //в очереди один элемент, начало и конец совпадают

for(int i=2; i<6; i++) add(&pend, i);

while (pbeg)

cout<<del(&pbeg)<<’ ‘;

}

//-------------------------------------------------

На экране: 1 2 3 4 5

//--------------------------------------------------------

//Начальное формирование очереди

Node* ftrst(int d)

{ Node* pv=new Node;

pv->d=d;

pv->p=0;

return pv;

}

//---------------------------------------------------------

//Добавление в конец очереди

void add(Node** pd, int d)

{ Node* pv=new Node;

pv->d=d;

pv->p=0;

(*pd)->p=pv;

*pd=pv;

}

//-------------------------------------------------------------------------------------------

//Выборка из начала очереди

int del(Node** pg)

{ int t = (*pg)->d;

Node* pv=*pg;

*pg=(*pg)->p;

delete pv;

return t;

}

//----------------------------------------------------------------------------------------------

Очередь приоритетов

Элементы добавляются в конец очереди независимо от приоритета, выборка – в порядке понижения приоритета.

Реализация очереди с помощью массива

Кроме массива данных, для реализации очереди требуется две переменных целого типа.

Линейные списки

Однонаправленный (односвязный) список

Кольцевой однонаправленный список

Двунаправленный (двусвязный) список

В каждый элемент двунаправленного списка добавлена вторая ссылка.

Кольцевой двунаправленный список

Используются также неоднородные списки с однородными подсписками. Во всех списках элемент может добавляться в любое место списка (список может быть упорядоченным). Удаление элемента (по какому-либо признаку) может выполняться также из любого места списка.

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

Для работы со списком используются операции:

1) начальное формирование списка;

2) добавление элемента в конец списка;

3) чтение элемента с заданным ключом;

4) вставка элемента в заданное место списка (после элемента с заданным ключом);

5) удаление элемента с заданным ключом;

6) упорядочивание списка по ключу.