Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать
  1. Параметризованная очередь. Параметризованный стек. Параметризованное бинарное дерево.

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

template <class T >

class описание класса

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

В качестве примера приведем описание класса stack, предназначенного для построения стеков фиксированного максимального размера с элементами произволного типа.

enum BOOLEAN ( FALSE, TRUE );

template <class Type >

class stack

{ private:

enum ( EMPTY = -1 );

Type* s; /* Указатель на массив стека */

Int max_len; /* Максимальная длина стека */

Int top; /* Индекс элемента в вершине стека */

public:

stack ( ) : max_len ( 100 ) /* конструктор без параметров */

{ s = new Type [ 100 ]; top = EMPTY; }

stack ( int size ) : max_len( size ) /* Второй конструктор */

{ s = new Type [ size ]; top = EMPTY; }

~stack ( ) { delete [ ] s; } /* Деструктор */

void reset ( ) { top = EMPTY; } /* Очистить стек */

void push ( Type c ) { s [ ++top ] = c; }

Type pop ( ) { return (s [top—] }

Type top_of ( ) { return ( s [top ] }

BOOLEAN empty ( ) { return BOOLEAN ( top == EMPTY ) }

BOOLEAN full ( ) { return BOOLEAN ( top == max_len ) }

};

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

Чтобы создать экземпляр параметризованного объектного типа, нужно уточнить имя типа значением параметра в угловых скобках:

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

template<class DataT> class tree

{

DataT info;

tree *llink;//ссылка на «левую» ветвь

tree *rlink;//ссылка на «правую» ветвь

public:

tree *root; // корень дерева

tree(){root=NULL;}; // конструктор

void in(tree<DataT> *&t); // ввод дерева

void btree1(tree<DataT> *t);

void btree2(tree<DataT> *t);

void btree3(tree<DataT>*t);

далее также реализуем ввод дерева,и обход, в обратном,концевом и прямых порядках.

Обход в прямом порядке – попасть в корень, пройти левое поддерево в прямом порядке.пройти правое поддерево в прямом порядке.

Обход в обратном порядке: пройти левое поддерево в обратном порядке, попасть в корень , и пройти правое поддерево в обратном порядке.

Обход в концевом порядке- пройти левое поддерево в концевом порядке, пройти правое поддерево в концевом порядке, попасть в корень.

Обходы бинарного дерева с рисунка.

1)в прямом порядке ABDCEGFHJ

2)в обратном DBAGECHFJ

3)в концевом DBGEHJFCA

Очередь – абстрактная структура данных, реализует принцип обслуживания FIFO. Это частный случай однонаправленного списка, добавление элементов в который выполняется в один конец, а выборка идет из другого конца. Таким образом, в структуре «очередь» определены две операции: добавление элементов и выборка. При выборке элемент из очереди исключается. В системном программировании очереди используются для диспетчеризации задач моделирования.

«первым пришел,первым ушел»

Необходимо, чтобы наш класс Queue поддерживал следующие операции:

1. добавить элемент в конец очереди: void add( item );

2. удалить элемент из начала очереди: item remove();

3. определить, пуста ли очередь: bool is_empty();

4. определить, заполнена ли очередь: bool is_full();

// объявление QueueItem

template <class T> class QueueItem;

template <class Type>

class Queue {

public:

Queue() : front( 0 ), back ( 0 ) { }

~Queue();

Type& remove();

void add( const Type & );

bool is_empty() const {

return front == 0;

}

private: QueueItem<Type> *front;

QueueItem<Type> *back;

};

#endif

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]