Способы реализации очереди




Объявление переменной

Объявление переменной в C++ происходит таким образом: сначала указывается тип данных для этой переменной, а затем название этой переменной.

Пример объявления переменных

int a; // объявление переменной a целого типа.

float b; // объявление переменной b типа данных с плавающей запятой.

double c = 14.2; // инициализация переменной типа double.

char d = 's'; // инициализация переменной типа char.

bool k = true; // инициализация логической переменной k.

 

2. Раскройте понятия: коллекции общего назначения, основные элементы класса Queue. Приведите примеры.

1) коллекции общего назначения (Не совсем уверен, что правильно, но это единственное что удалость найти)

 

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

Основное достоинство коллекций состоит в том, что они стандартизируют способ обработки групп объектов в прикладных программах. Все коллекции разработаны на основе набора четко определенных интерфейсов. Ряд встроенных реализаций таких интерфейсов, как ArrayList, Hashtable, Stack и Queue, вы можете использовать "как есть". У каждого программиста также есть возможность реализовать собственную коллекцию, но в большинстве случаев достаточно.

Коллекции общего назначения

Классы коллекций общего назначения:

Класс Описание
· Stack Стек - частный случай однонаправленного списка, действующий по принципу: последним пришел - первым вышел
· Queue Очередь - частный случай однонаправленного списка, действующего по принципу:первым пришел - первым вышел
· ArrayList Динамический массив, т.е. массив который при необходимости может увеличивать свой размер
· Hashtable Хеш-таблица для пар ключ/значение
· SortedList Отсортированный список пар ключ/значение
   

Пример коллекции общего назначения будет являться класс Queue который представлен ниже

2) основные элементы класса Queue:

Очередь – это динамическая структура данных которая состоит из набора элементов которые размещены последовательно друг за другом. При этом добавление элементов осуществляется с одной стороны, а удаление (вытягивание) – с другой стороны.
Очередь построена по принципу LILO (last in — last out: последним пришел — последним вышел).

Пример очереди:

· очередь в магазине;

· очередь документов на печать на принтере;

Виды очередей

Различают следующие виды очередей:

· простая очередь;

· кольцевая очередь. В такой очереди элемент, который выходит с начала очереди, будет помещен в ее конец;

· очередь с приоритетами. В такой очереди элементы размещаются по их приоритетам (весовым коэффициентам). Первым из очереди выходит элемент с наивысшим приоритетом.

Любой вид очереди может иметь ограничение по размеру (количество элементов в очереди).

Способы реализации очереди

В программе очередь можно реализовывать в виде:

· статического массива с ограничением на размер в очереди;

· динамического массива;

· односвязного списка;

двусвязного списка.

 

 

В примере объявляется шаблонный класс Queue, реализующий очередь в виде динамического массива для некоторого обобщенного типа T.

В классе реализованы следующие поля и методы:

· целочисленная внутренняя переменная count – количество элементов в очереди;

· внутренняя переменная p – указатель на тип T. Этот указатель есть массивом данных образующих очередь. Элемент массива с индексом 0 есть началом очереди. Элемент с индексом count-1 есть конец очереди;

· конструктор по умолчанию;

· конструктор копирования Queue(const Queue&);

· оператор копирования operator=(const Queue&);

· метод push() – добавляет элемент в конец очереди;

· деструктор;

· метод pop() – вытягивает первый элемент из очереди;

· метод GetItem() – читает первый элемент из очереди не вытягивая его;

· метод clear() – очищает очередь;

· метод IsEmpty() – проверяет пустая ли очередь;

· метод Get() – возвращает количество элементов в очереди;

· метод print() – выводит очередь на экран.

#include <iostream>

#include <new>

using namespace std;

 

// Динамическая структура данных "очередь"

template <typename T>

class Queue

{

private:

T* p; // динамический массив

int count; // количество элементов в очереди

 

public:

// конструктор по умолчанию

Queue()

{

count = 0; // очередь пустая

}

 

// конструктор копирования

Queue(const Queue& obj)

{

// скопировать obj в текущий объект

count = obj.count;

 

try {

// попытка выделить память для p

p = new T[count];

// заполнить значениями

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

p[i] = obj.p[i];

}

catch (bad_alloc e)

{

// если память не выделена, то вывести текст ошибки

cout << e.what() << endl;

count = 0; // создать пустую очередь

}

}

 

// добавить элемент в очередь

void push(T item)

{

T* p2; // объявить дополнительный указатель

p2 = p; // перенаправить дополнительный указатель на p

 

try {

// попытка выделить новый фрагмент памяти для p, но на 1 больше

p = new T[count + 1];

 

// скопировать данные из участка на который указывает p2 (старые данные)

// в участок, на который указывает p

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

p[i] = p2[i];

 

// скопировать последний элемент

p[count] = item;

 

// увеличить количество элементов на 1

count++;

 

// освободить предварительно выделенную память

if (count > 1)

delete[] p2;

}

catch (bad_alloc e)

{

// если память не выделена

cout << e.what() << endl; // вывести сообщение об ошибке

 

// вернуть старый указатель на p

p = p2;

}

}

 

// вытянуть первый элемент из очереди

T pop()

{

if (count == 0)

return 0;

 

// заполнить элемент, который вытягивается из очереди

T item;

 

item = p[0];

 

// сформировать новый участок памяти, который на 1 меньше

try {

T* p2;

 

// попытка выделить пам'ять

p2 = new T[count - 1];

 

count--; // уменьшить количество элементов в очереди

 

// p=>p2

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

p2[i] = p[i + 1]; // копируются все кроме первого элемента

 

// освободить участок, на который указывает p

if (count > 0)

delete[] p;

 

// перенаправить p на p2

p = p2;

 

// вернуть item

return item;

}

catch (bad_alloc e)

{

// если память не выделилась, то вернуть 0

cout << e.what() << endl;

return 0;

}

}

 

// операторная функция operator=(),

// реализует присваивание объектов типа Queue

Queue& operator=(const Queue& obj)

{

T* p2; // указатель на дополнительную память

 

try {

// попытка выделить новый участок памяти для p2

p2 = new T[obj.count];

 

// если память выделена успешно,

// можно освобождать предварительно выделенную память для p

if (count > 0)

delete[] p;

 

// скопировать obj в текущий объект

p = p2; // перенаправить p на p2

count = obj.count;

 

// заполнить значениями

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

p[i] = obj.p[i];

}

catch (bad_alloc e)

{

// если память не выделилась, то вывести соответствующее сообщение

cout << e.what() << endl;

}

return *this; // вернуть текущий объект

}

 

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

~Queue()

{

if (count > 0)

delete[] p;

}

 

// взять первый элемент из очереди не вытягивая его

T GetItem()

{

if (count > 0)

return p[0];

else

return 0;

}

 

// очистка очереди

void clear()

{

if (count > 0)

{

delete[] p;

count = 0;

}

}

 

// проверка существования элементов в очереди

bool IsEmpty()

{

return count == 0;

}

 

// количество элементов в очереди

int GetN()

{

return count;

}

 

// метод, выводящий очередь

void print(const char* objName)

{

cout << "Object: " << objName << endl;

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

cout << p[i] << "\t";

cout << endl;

cout << "---------------------" << endl;

}

};

 

void main()

{

Queue<int> Q1;

Q1.print("Q1");

 

Q1.push(5);

Q1.print("Q1");

 

Q1.push(8);

Q1.push(11);

Q1.push(17); // Q1 = {5,8,11,17}

Q1.print("Q1");

 

int d;

d = Q1.GetItem();

cout << "d = " << d << endl;

 

Q1.print("Q1");

 

Queue<int> Q2 = Q1;

Q2.print("Q2");

 

Queue<int> Q3;

Q3 = Q1 = Q2;

Q1.push(333);

Q2.push(555);

 

Q1.print("Q1");

Q2.print("Q2");

Q3.print("Q3");

 

Q2.clear();

if (Q2.IsEmpty())

cout << "OK" << endl;

else

cout << "NO" << endl;

 

cout << "n = " << Q3.GetN() << endl;

 

 

}

Задача (билет 2)

1.Составить программу для расчета заданных выражений. Вводить исходные данные с клавиатуры. Обязательно проверять исключительные ситуации. Значение p = 3,1415926.

#include<stdio.h>

#include<iostream>

#include<conio.h>

#include<math.h>

using namespace std;

void main()

{

setlocale(LC_ALL, "rus");

int x,y,z;

double pi= 3.1415926;

double e = 2.72;

double h;

cout << "Введите х" << endl;

cin >> x;

cout << "Введите y" << endl;

cin >> y;

cout << "Введите z" << endl;

cin >> z;

h = ((pow(x, y + 1) + pow(e, y - 1)) / (1 + x * fabs(y - tan(z)))) * (1 + fabs(y - x)) + ((pow(fabs(y - x), 2)) / (2)) - ((pow(fabs(y - x), 3)) / (3));

cout << h << endl;

system("pause");

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-06 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: