Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

10.1.1. Специальные типы линейных списков

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

Стек – это линейный список, в котором все включения, исключения и доступ выполняются только с одного конца списка, называемом вершиной стека. Дисциплина обслуживания стека обозначается аббревиатурой LIFO (last-in-first-out: последний пришел – первым ушел). Над стеком выполняют операции:

  • возвращение элемента из вершины стека;

  • удаление элемента из вершины стека;

  • вставка элемента в вершину стека;

  • очистка стека;

  • проверка стека на пустоту.

Стек в программировании часто используется для временного хранение данных, например, стек программы используется для хранения локальных переменных вызываемых подпрограмм. По мере выполнения подпрограмм стек программы освобождается.

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

  • возвращение элемента из начала очереди;

  • удаление элемента из начала очереди;

  • вставка элемента в конец очереди;

  • очистка очереди;

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

Примером очереди является очередь заданий на печать к одному принтеру при использовании компьютеров локальной сети.

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

Дек – это линейный список, в котором операции включения, исключения и доступа выполняются только на концах списка. Существуют два специальных типа дека: дек с ограниченным входом и дек с ограниченным выходом. В деке с ограниченным входом включение элементов выполняется только с одного конца, а исключение элементов и доступ к элементам – с двух концов. В деке с ограниченным выходом исключение элементов и доступ к ним выполняется только с одного конца дека, а включение элементов – с двух концов.

10.1.2. Реализация линейного списка с помощью массива

При реализации списка с помощью массива элементы списка располагаются в смежных участках памяти. Такое представление списка позволяет:

  • легко просматривать весь список;

  • быстро находить элемент списка по его положению (индексу);

  • эффективно выполнять операции добавления/ удаления в конец списка;

  • использовать алгоритмы быстрого поиска элемента для упорядоченного списка.

Недостатки реализации:

  • большие временные затраты на выполнение операций включения и исключения элементов в середину или начало списка, так как эти операции требуют перемещения всех последующих элементов на одну позицию к концу (началу) массива;

  • память под массив должна выделяться с запасом, чтобы исключить переполнение массива;

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

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

#include <iostream.h>

#include <conio.h.

сonst int size=100; //максимальная длина списка

//Функция включает в конец списка из n элементов число х, при

//переполнении списка ok=false

void insert (int &n, int a[], int x, bool &ok);

//Функция исключает последний элемент из списка и

//возвращает его значение х, при пустом списке ok=false

void del (int &n, int a[], int &x, bool &ok);

//Функция находит номер первого элемента со значением х и

// возвращает его, при отсутствии элемента возвращает -1

int search(int n, int a[], int x,);

void main()

{

int a[size]; //массив для хранения списка

int n; //текущий размер списка

int x, m; // значение элемента списка и его номер

bool ok; //признак выполнения операции

cout<<”n? “; cin>>n;

cout<<”a? “;

//Ввод списка в массив

for (int i=0; i<=n-1; i++)

cin>>a[i];

cout<<”x? “; cin>>x;

//Поиск позиции вхождения х в список

m=search(n,a,x);

if (m==-1)

cout<<”No”<<endl;

else

<<”m=”<<m<<endl;

cout<<”x? “; cin>>x;

//Включение элемента со значением х в список

insert(n,a,x,ok);

if (!ok)

cout<<”Error”<<endl;

//Исключение последнего элементаиз списка

del(n,a,x,ok);

cout<<”x=”<<x;

getch();

}

void insert (int &n, int a[], int x, bool &ok)

{

if (n==size)

ok=false;

else

{

a[n]=x;

n++;

ok=true;

}

}

void del (int &n, int a[], int &x, bool &ok)

{

if (n==0)

ok=false;

else

{

x=a[n];

n--;

ok=true;

}

}

int search(int n, int a[], int x,)

{

for (int i=0; i<=n-1; i++)

if (a[i]==x)

return i;

return -1;

}