Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт_Списки.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
262.9 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

высшего образования

Пермский национальный исследовательский

политехнический университет

Кафедра «Информационные технологии и автоматизированные системы»

Шаблоны, очереди, списки

Выполнил(а): студент(ка) группы РИС-16-1б

Болилый В.С.

Проверил: доцент ИТАС

Полякова О.А.

Пермь, 2017

СОДЕРЖАНИЕ

Контейнер 3

Шаблоны классов 4

Списки 8

Очередь 19

Литература 24

Контейнер

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

Контейнеры можно разделить на два типа: последовательные и ассоциативные.

Последовательные контейнеры обеспечивают хранение конечного количества однотипных объектов в виде непрерывной последовательности.

Ассоциативные контейнеры обеспечивают быстрый доступ к данным по ключу.

Итератор

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

Итератор произвольного доступа

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

Двунаправленный итератор

Хранит и извлекает значения. Перемещается вперед и назад.

Прямой итератор

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

Итератор ввода

Извлекает, но не хранит элементы. Перемещается только вперед.

Итератор вывода

Хранит, но не извлекает значения. Перемещается только вперед.

Шаблоны классов

С помощью шаблонов можно создавать обобщенные функции и классы, которые работают с типом данных, заданным как параметр. Таким образом, одну и ту же функцию или класс можно применять к разным типам данным, не используя отдельные варианты для каждого типа.

Синтаксис описания шаблона:

template <описание__параметров_шаблона> определение_класса:

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

Типы могут быть как стандартными, так и определенными пользователем. Для их описания используется ключевое слово class. Внутри шаблона параметр типа может применяться в любом месте, где допустимо использовать спецификацию типа.

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

template <описание_параметров_шаблона>

возвр_тип имя_класса <параметры_шаблона>::

имяфункции (список_параметров функции)

Правила описания шаблонов:

  • Локальные классы не могут содержать шаблоны в качестве своих элементов.

  • Шаблоны методов не могут быть виртуальными.

  • Шаблоны классов могут содержать статические элементы, дружественные функции и классы.

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

  • Внутри шаблона нельзя определять friend-шаблоны.

Использование шаблонного класса:

Имя_шаблона <аргументы>имя_объекта [(параметры_конструктора)]:

Листинг 10: Пример шаблонного класса стек:

#pragma once

#include <iostream>

template<class DType>

class Stack{

DType *stck;

int top;

int size;

public:

//Конструктор

Stack(int s);

Stack(const Stack &st);

~Stack();

// операции модификации стека

void push(const DType &item);

DType pop();

void clear();

// доступ к стеку

DType peek (void) const;

int get_size() const { return size;}

// методы проверки стека

bool isEmpty() const;

bool isFull() const; // реализация массива

template<class ZType>

friend std::is

tream &operator>>(std::istream &is, Stack<ZType> &st);

template<class ZType>

friend std::ostream &operator<<(std::ostream &os, Stack<ZType> &st);

template<class ZType>

friend void operator<<(Stack<ZType> &st, const ZType &obj);

template<class ZType>

friend void operator>>(Stack<ZType> &st, ZType &obj);

};

template<class DType>

Stack<DType>::Stack(int s)

{

top = -1;

stck = new DType[size];

size =s;

}

template<class DType>

Stack<DType>::Stack(const Stack &st)

{

top = st.top;

size = st.size;

stck = new DType[size];

for(int i=0; i<size; i++)

stck[i] = st.stck[i];

}

template<class DType>

Stack<DType>::~Stack()

{

delete [] stck;

}

template<class DType>

void Stack<DType>::push(const DType &item)

{

if (top == size-1){

std::cerr << "Стек полон.\n";

return;

}

stck[++top] = item;

}

template<class DType>

DType Stack<DType>::pop()

{

if (top == -1){

std::cerr << "Стек пуст.\n";

return 0;

}

return stck[top--];

}

template<class DType>

void Stack<DType>::clear(void)

{

top = -1;

}

template<class DType>

DType Stack<DType>::peek() const

{

if (top == -1)

{

std::cerr << "Стэк пуст!\n";

exit(1);

}

return stck[top];

}

template<class DType>

bool Stack<DType>::isEmpty() const

{

return top == -1;

}

template<class DType>

bool Stack<DType>::isFull() const

{

return top == size-1;

}

template<class DType>

std::istream &operator>>(std::istream &is, Stack<DType> &st)

{

if (st.top == st.size-1){

std::cerr << "Стек полон.\n";

return is;

}

is >> st.stck[++st.top];

return is;

}

template<class DType>

std::ostream &operator<<(std::ostream &os, Stack<DType> &st)

{

if (st.top == -1){

std::cerr << "Стек пуст.\n";

return os;

}

os << st.stck[st.top--];

return os;

}

template<class DType>

void operator<<( Stack<DType> &st, const DType &obj)

{

if (st.top == st.size-1){

std::cerr << "Стек полон.\n";

return;

}

st.stck[++st.top] = obj;

}

template<class DType>

void operator>>(Stack<DType> &st, DType &obj)

{

if (st.top == -1){

std::cerr << "Стек пуст.\n";

return;

}

obj = st.stck[st.top--];

}

Пример использования:

#include <iostream>

#include "stack_v3.h"

using namespace std;

int main()

{

system("chcp 65001");

Stack<int> st(5);

for (int i=0; i< st.get_size(); i++){

st << i;

}

cout << st.peek() << endl;

Stack<int> st2 = st;

int temp;

for (int i=0; i< st.get_size(); i++){

cout << "st: " << st << endl;

st2 >> temp;

cout << "st2: "<< temp << endl;

}

return 0;

}

Результат:

4

st: 4

st2: 4

st: 3

st2: 3

st: 2

st2: 2

st: 1

st2: 1

st: 0

st2: 0

Списки

Связный список —динамическая структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка

Связанные списки предоставляют эффективные методы обработки и снимают многие ограничения, отмеченные при описании массивов.

Узлы

Независимые элементы в связанном списке называются узлами (nodes).

Узел (node) состоит из поля данных и указателя, обозначающего следующий элемент в списке. Указатель — это соединитель, связывающий вместе отдельные узлы списка.

Связанный список состоит из множества узлов, первый элемент которого (front), — это узел, на который указывает голова (head). Список связывает узлы вместе от первого до конца или хвоста (rear) списка. Хвост определяется как узел, чье поле указателя имеет значение NULL (0). Списочные приложения проходят по узлам, следуя за каждым указателем на следующий узел. В любой точке сканирования на текущее положение ссылается указатель currPtr. Для списка без узлов head будет содержать значение NULL.

ADT формат

ADT Node

Данные

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

Операции

Конструктор

Начальные значения: Значение данных и указатель на следующий узел.

Процесс: Инициализация двух полей.

NextNode

Вход: Нет

Предусловия: Нет

Процесс: Выборка значения поля next

Выход: Возвращение значения поля next.

Постусловия: Нет

InsertAfter

Вход: Указатель на новый узел.

Предусловия: Нет

Процесс: Переустановка значения next для указания на новый узел и установка значения next в новом узле для ссылки на узел, следующий за текущим.

Выход: Нет

Постусловия: Узел теперь указывает на новый узел

DeleteAfter

Вход: Нет

Предусловия: Нет

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

Выход: Указатель на удаленный узел.

Постусловия: Узел имеет новое значение next.

Конец ADT Node

Операции: