Пример 1. Дана строка символов. Проверьте правильность расстановки в ней круглых скобок.

Лабораторная работа № 25

Стек и очередь. Бинарные деревья.

Стек и очередь – это частные случаи линейного списка.

Стеки

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

Стек (англ. stack – стопка) – это структура данных, в которой новый элемент всегда записывается в ее начало (вершину) и очередной читаемый элемент также всегда выбирается из ее начала ( рис. 1). В стеках используется метод доступа к элементам LIFO ( Last Input – First Output, "последним пришел – первым вышел"). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно сначала взять верхнюю.

Стек – это список, у которого доступен один элемент (одна позиция). Этот элемент называется вершиной стека. Взять элемент можно только из вершины стека, добавить элемент можно только в вершину стека. Например, если записаны в стек числа 1, 2, 3, то при последующем извлечении получим 3,2,1.


Рис. 1. Стек и его организация

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

struct имя_типа {            информационное поле;            адресное поле;           };

где информационное поле – это поле любого ранее объявленного или стандартного типа;

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

Например:

struct list {              type pole1;        list *pole2;             } stack;

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

Описание элементов стека аналогично описанию элементов линейного однонаправленного списка. Поэтому объявим стек через объявление линейного однонаправленного списка:

struct Stack {         Single_List *Top;//вершина стека        };. . . . . . . . . . Stack *Top_Stack;//указатель на вершину стека

Основные операции, производимые со стеком:

· создание стека;

· печать (просмотр) стека;

· добавление элемента в вершину стека;

· извлечение элемента из вершины стека;

· проверка пустоты стека;

· очистка стека.

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

//создание стекаvoid Make_Stack(int n, Stack* Top_Stack){ if (n > 0) { int tmp;//вспомогательная переменная cout << "Введите значение "; cin >> tmp; //вводим значение информационного поля Push_Stack(tmp, Top_Stack); Make_Stack(n-1,Top_Stack); }} //печать стекаvoid Print_Stack(Stack* Top_Stack){ Print_Single_List(Top_Stack->Top); } //добавление элемента в вершину стекаvoid Push_Stack(int NewElem, Stack* Top_Stack){ Top_Stack->Top =Insert_Item_Single_List(Top_Stack->Top,1,NewElem);} //извлечение элемента из вершины стекаint Pop_Stack(Stack* Top_Stack){ int NewElem = NULL; if (Top_Stack->Top != NULL) { NewElem = Top_Stack->Top->Data; Top_Stack->Top = Delete_Item_Single_List(Top_Stack->Top,0);     //удаляем вершину } return NewElem;} //проверка пустоты стекаbool Empty_Stack(Stack* Top_Stack){ return Empty_Single_List(Top_Stack->Top); } //очистка стекаvoid Clear_Stack(Stack* Top_Stack){ Delete_Single_List(Top_Stack->Top); }

Пример 1. Дана строка символов. Проверьте правильность расстановки в ней круглых скобок.

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

//главная функцияint _tmain(int argc, _TCHAR* argv[]){ char text[255];   printf("Введите текст, содержащий \"(\" и \")\" \n");   gets(text);   Check_Brackets (text); system("pause"); return 0;} //функция проверки правильности расстановки скобокvoid Check_Brackets (char *text){ int i;   int flag=1; Stack *Top_Stack; Top_Stack = new Stack(); for(i=0;i<strlen(text); i++) { if(text[i]==')' ) {       if(Empty_Stack(Top_Stack)) { //Попытка удалить нулевой элемент стека         flag=0;         break;       }     if(Top_Stack->Top->Data == '(')         Pop_Stack(Top_Stack);     else {   flag=0;         break;        } } if(text[i]=='(')     Push_Stack(text[i],Top_Stack);   } if(flag!=0 && Empty_Stack(Top_Stack))     printf("Верно!");   else printf("Неверно!");   Clear_Stack(Top_Stack);   printf("\n"); }

Очереди

Очередь – это структура данных, представляющая собой последовательность элементов, образованная в порядке их поступления. Каждый новый элемент размещается в конце очереди; элемент, стоящий в начале очереди, выбирается из нее первым. В очереди используется принцип доступа к элементам FIFO ( First Input – First Output, "первый пришёл – первый вышел") ( рис. 2). В очереди доступны два элемента (две позиции): начало очереди и конец очереди. Поместить элемент можно только в конец очереди, а взять элемент только из ее начала. Примером может служить обыкновенная очередь в магазине.


Рис.2. Очередь и ее организация

Описание очереди выглядит следующим образом:

struct имя_типа {            информационное поле;            адресное поле1;            адресное поле2;           };

где информационное поле – это поле любого, ранее объявленного или стандартного, типа;

адресное поле1, адресное поле2 – это указатели на объекты того же типа, что и определяемая структура, в них записываются адреса первого и следующего элементов очереди.

Например:

1 способ: адресное поле ссылается на объявляемую структуру.

struct list2 {         type pole1;         list2 *pole1, *pole2;              }

2 способ: адресное поле ссылается на ранее объявленную структуру.

struct list1 {               type pole1;         list1 *pole2;              }struct ch3 {             list1 *beg, *next ;            }

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

Описание элементов очереди аналогично описанию элементов линейного двунаправленного списка. Поэтому объявим очередь через объявление линейного двунаправленного списка:

struct Queue {         Double_List *Begin;//начало очереди         Double_List *End; //конец очереди        };. . . . . . . . . . Queue *My_Queue;//указатель на очередь

Основные операции, производимые с очередью:

· создание очереди;

· печать (просмотр) очереди;

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

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

· проверка пустоты очереди;

· очистка очереди.

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

//создание очередиvoid Make_Queue(int n, Queue* End_Queue){ Make_Double_List(n,&(End_Queue->Begin),NULL); Double_List *ptr; //вспомогательный указатель ptr = End_Queue->Begin; while (ptr->Next != NULL) ptr = ptr->Next; End_Queue->End = ptr;} //печать очередиvoid Print_Queue(Queue* Begin_Queue){ Print_Double_List(Begin_Queue->Begin);} //добавление элемента в конец очередиvoid Add_Item_Queue(int NewElem, Queue* End_Queue){ End_Queue->End = Insert_Item_Double_List(End_Queue->End, 0, NewElem)->Next;} //извлечение элемента из начала очередиint Extract_Item_Queue(Queue* Begin_Queue){ int NewElem = NULL; if (Begin_Queue->Begin != NULL) { NewElem = Begin_Queue->Begin->Data; Begin_Queue->Begin=Delete_Item_Double_List(Begin_Queue->Begin,0); //удаляем вершину } return NewElem;} //проверка пустоты очередиbool Empty_Queue(Queue* Begin_Queue){ return Empty_Double_List(Begin_Queue->Begin); } //очистка очередиvoid Clear_Queue(Queue* Begin_Queue){ return Delete_Double_List(Begin_Queue->Begin); }

Пример 2. Дана последовательность ненулевых целых чисел. Признаком конца последовательности является число 0. Найдите среди них первый наибольший отрицательный элемент. Если такого элемента нет, то выведите сообщение об этом.

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

//главная функцияint _tmain(int argc, _TCHAR* argv[]){ int n; Queue *My_Queue; My_Queue = new Queue(); Make_Queue(1,My_Queue); while (My_Queue->End->Data != 0){ cout << "Введите значение "; cin >> n; Add_Item_Queue(n,My_Queue); } cout << "\nОчередь: \n"; Print_Queue(My_Queue);   Find_Max_Negative_Element(My_Queue); system("pause"); return 0;} //функция поиска первого наибольшего отрицательного элементаvoid Find_Max_Negative_Element(Queue* Begin_Queue){ int tmp; int max=Extract_Item_Queue(Begin_Queue); while (Begin_Queue->Begin->Data != 0) { tmp = Extract_Item_Queue(Begin_Queue); if (max > 0 || tmp < 0 && abs(tmp) < abs(max))       max = tmp; } if (max > 0) printf("Элементов нет!"); else printf("Есть такой элемент: %d", max);}Бинарные деревья.

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

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

Дерево – это структура данных, представляющая собой совокупность элементов и отношений, образующих иерархическую структуру этих элементов ( рис. 3). Каждый элемент дерева называется вершиной (узлом) дерева. Вершины дерева соединены направленными дугами, которые называют ветвями дерева. Начальный узел дерева называют корнем дерева, ему соответствует нулевой уровень. Листьями дерева называют вершины, в которые входит одна ветвь и не выходит ни одной ветви.

Каждое дерево обладает следующими свойствами:

1. существует узел, в который не входит ни одной дуги (корень);

2. в каждую вершину, кроме корня, входит одна дуга.

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


Рис. 3 Дерево

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

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

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

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

· двоичные – степень дерева не более двух;

· сильноветвящиеся – степень дерева произвольная.

Упорядоченное дерево – это дерево, у которого ветви, исходящие из каждой вершины, упорядочены по определенному критерию.

Деревья являются рекурсивными структурами, так как каждое поддерево также является деревом. Таким образом, дерево можно определить как рекурсивную структуру, в которой каждый элемент является:

· либо пустой структурой;

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

Действия с рекурсивными структурами удобнее всего описываются с помощью рекурсивных алгоритмов.

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

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

Обход дерева – это упорядоченная последовательность вершин дерева, в которой каждая вершина встречается только один раз.

При обходе все вершины дерева должны посещаться в определенном порядке. Существует несколько способов обхода всех вершин дерева. Выделим три наиболее часто используемых способа обхода дерева ( рис. 4):

· прямой;

· симметричный;

· обратный.


Рис. 4. Обходы деревьев

Существует большое многообразие древовидных структур данных. Выделим самые распространенные из них: бинарные (двоичные) деревья, красно-черные деревья, В-деревья, АВЛ-деревья, матричные деревья, смешанные деревья и т.д.

Бинарные деревья

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

Бинарное (двоичное) дерево – это динамическая структура данных, представляющее собой дерево, в котором каждая вершина имеет не более двух потомков ( рис. 5). Таким образом, бинарное дерево состоит из элементов, каждый из которых содержит информационное поле и не более двух ссылок на различные бинарные поддеревья. На каждый элемент дерева имеется ровно одна ссылка.


Рис. 5. Бинарное дерево и его организация

Каждая вершина бинарного дерева является структурой, состоящей из четырех видов полей. Содержимым этих полей будут соответственно:

· информационное поле (ключ вершины);

· служебное поле (их может быть несколько или ни одного);

· указатель на левое поддерево;

· указатель на правое поддерево.

По степени вершин бинарные деревья делятся на ( рис. 6):


Рис. 6.

· строгие – вершины дерева имеют степень ноль (у листьев) или два (у узлов);

· нестрогие – вершины дерева имеют степень ноль (у листьев), один или два (у узлов).

В общем случае у бинарного дерева на k -м уровне может быть до 2k-1 вершин. Бинарное дерево называется полным, если оно содержит только полностью заполненные уровни. В противном случае оно является неполным.

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

Бинарное дерево может представлять собой пустое множество. Бинарное дерево может выродиться в список ( рис. 7).


Рис. 7. Список как частный случай бинарного дерева

Структура дерева отражается во входном потоке данных так: каждой вводимой пустой связи соответствует условный символ, например, '*' (звездочка). При этом сначала описываются левые потомки, затем, правые. Для структуры бинарного дерева, представленного на следующем рисунке 6, входной поток имеет вид: ABD*G***CE**FH**J**.


Рис. 8. Адресация в бинарном дереве

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

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

struct имя_типа {

            информационное поле;

            [служебное поле;]

            адрес левого поддерева;

            адрес правого поддерева;

           };

где информационное поле – это поле любого ранее объявленного или стандартного типа;

адрес левого (правого) поддерева – это указатель на объект того же типа, что и определяемая структура, в него записывается адрес следующего элемента левого (правого) поддерева.

Например:

struct point {

         int data;//информационное поле

         int count; //служебное поле

         point *left;//адрес левого поддерева

         point *right;//адрес правого поддерева

        };

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

· создание бинарного дерева;

· печать бинарного дерева;

· обход бинарного дерева;

· вставка элемента в бинарное дерево;

· удаление элемента из бинарного дерева;

· проверка пустоты бинарного дерева;

· удаление бинарного дерева.

Для описания алгоритмов этих основных операций используется следующее объявление:

struct BinaryTree{

  int Data; //поле данных

  BinaryTree* Left; //указатель на левый потомок

  BinaryTree* Right; /указатель на правый потомок

};

. . . . . . . . . .

BinaryTree* BTree = NULL;

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

//создание бинарного дерева

void Make_Binary_Tree(BinaryTree** Node, int n){

BinaryTree** ptr;//вспомогательный указатель

srand(time(NULL)*1000);

while (n > 0) {

ptr = Node;

while (*ptr != NULL) {

if ((double) rand()/RAND_MAX < 0.5)

   ptr = &((*ptr)->Left);

else ptr = &((*ptr)->Right);

}

(*ptr) = new BinaryTree();

cout << "Введите значение ";

cin >> (*ptr)->Data;

n--;

}

}

 

//печать бинарного дерева

void Print_BinaryTree(BinaryTree* Node, int l){

int i;

if (Node != NULL) {

Print_BinaryTree(Node->Right, l+1);

for (i=0; i< l; i++) cout << " ";

printf ("%4ld", Node->Data);

Print_BinaryTree(Node->Left, l+1);

}

else cout << endl;

}

 

//прямой обход бинарного дерева

void PreOrder_BinaryTree(BinaryTree* Node){

if (Node != NULL) {

printf ("%3ld",Node->Data);

PreOrder_BinaryTree(Node->Left);

PreOrder_BinaryTree(Node->Right);

}

}

 

//обратный обход бинарного дерева

void PostOrder_BinaryTree(BinaryTree* Node){

if (Node != NULL) {

PostOrder_BinaryTree(Node->Left);

PostOrder_BinaryTree(Node->Right);

printf ("%3ld",Node->Data);

}

}

 

//симметричный обход бинарного дерева

void SymmetricOrder_BinaryTree(BinaryTree* Node){

if (Node != NULL) {

PostOrder_BinaryTree(Node->Left);

printf ("%3ld",Node->Data);

PostOrder_BinaryTree(Node->Right);

}

}

 

//вставка вершины в бинарное дерево

void Insert_Node_BinaryTree(BinaryTree** Node,int Data) {

BinaryTree* New_Node = new BinaryTree;

New_Node->Data = Data;

New_Node->Left = NULL;

New_Node->Right = NULL;

BinaryTree** ptr = Node;//вспомогательный указатель

srand(time(NULL)*1000);

while (*ptr != NULL) {

double q = (double) rand()/RAND_MAX;

if ( q < 1/3.0) ptr = &((*ptr)->Left);

else if ( q > 2/3.0) ptr = &((*ptr)->Right);

else break;

}

if (*ptr != NULL) {

if ( (double) rand()/RAND_MAX < 0.5 )

New_Node->Left = *ptr;

else New_Node->Right = *ptr;

*ptr = New_Node;

}

else{

*ptr = New_Node;

}

}

 

//удаление вершины из бинарного дерева

void Delete_Node_BinaryTree(BinaryTree** Node,int Data){

if ( (*Node) != NULL ){

if ((*Node)->Data == Data){

BinaryTree* ptr = (*Node);

if ( (*Node)->Left == NULL && (*Node)->Right == NULL ) (*Node) = NULL;

else if ((*Node)->Left == NULL) (*Node) = ptr->Right;

else if ((*Node)->Right == NULL) (*Node) = ptr->Left;

else {

   (*Node) = ptr->Right;

   BinaryTree ** ptr1;

   ptr1 = Node;

   while (*ptr1 != NULL)

     ptr1 = &((*ptr1)->Left);

   (*ptr1) = ptr->Left;

}

delete(ptr);

Delete_Node_BinaryTree(Node,Data);

}

else {

Delete_Node_BinaryTree(&((*Node)->Left),Data);

Delete_Node_BinaryTree(&((*Node)->Right),Data);

}

}

}

 

//проверка пустоты бинарного дерева

bool Empty_BinaryTree(BinaryTree* Node){

return ( Node == NULL ? true : false );

}

 

//освобождение памяти, выделенной под бинарное дерево

void Delete_BinaryTree(BinaryTree* Node){

if (Node != NULL) {

Delete_BinaryTree(Node->Left);

Delete_BinaryTree(Node->Right);

delete(Node);

}

}

Задания для выполнения

  1. Опишите стек с целочисленным информационным полем. Заполните его длинами строк, считанных из файла. Распечатайте на экране содержимое стека. Укажите номер и длину последней самой короткой строки файла.
  2. Разработайте программу, с помощью которой можно определить количество элементов  очереди с вещественным информационным полем после добавления и удаления элементов из очереди. Вывести первоначальную очередь и очередь после каждой операции.
  3. Опишите очередь с вещественным информационным полем, и заполните ее элементами с клавиатуры. Выполните циклический сдвиг элементов в очереди так, чтобы в ее начале был расположен наибольший элемент.
  4. Разработайте программу, с помощью которой можно определить наибольший допустимый размер стека с вещественным информационным полем. Найдите этот размер (число элементов в стеке). Сравните с наибольшим допустимым размером очереди с аналогичным информационным полем.
  5. Найдите количество четных элементов бинарного дерева. Укажите эти элементы и их уровни.
  6. Индивидуальные задания.

 

Вариант Задание
1. Создать очередь из сведений о клиентах банка: фамилии и суммы на счету. Определить количество клиентов банка, у которых сумма на счету больше 10000 гр. Организовать просмотр данных очереди.
2. Создать очередь, информационными полями которого являются: книга и её цена. Добавить в очередь сведения о новой книге. Организовать просмотр данных очереди и вычислить среднюю цену книг.
3. Создать очередь из целых чисел. Определить количество положительных элементов очереди. Организовать просмотр данных очереди.
4. Создать стек, информационными полями которого являются: книга и её цена. Добавить в стек сведения о новой книге. Организовать просмотр данных стека и вычислить среднюю цену книг.
5. Создать очередь из целых чисел. Определить среднее значение элементов очереди. Организовать просмотр данных очереди.
6. Создать очередь из целых чисел. Определить количество четных значений элементов очереди. Организовать просмотр данных очереди.
7. Создать очередь, информационными полями которой являются: наименование процессора и его тактовая частота и количество ядер. Добавить в очередь сведения о новом процессоре. Организовать просмотр данных очереди и распечатать данные о многоядерных процессорах (количество ядер больше 1).
8. Создать стек из целых чисел. Вычислить среднее арифметическое чётных значений элементов стека. Организовать просмотр данных стека.
9. Создать очередь, информационными полями которой являются: наименование товара и его стоимость. Добавить в очередь сведения о новом товаре. Организовать просмотр данных очереди и вычислить общую стоимость товаров с наименованием «Ручка шариковая».
10. Создать стек, информационными полями которого являются: наименование товара и его цена. Добавить в стек сведения о новом товаре. Организовать просмотр данных стека и вычислить среднюю цену товаров.
11. Создать очередь из вещественных чисел. Определить минимальный элемент очереди. Организовать просмотр данных очереди.
12. Создать стек, информационными полями которого являются: улица, номер дома и номер квартиры. Добавить в стек сведения о новой квартире. Организовать просмотр данных стека и определить количество домов на улице «Дерибасовская».
13. Дано число N (> 0) и указатели P1 и P2 на начало и конец непустой очереди. Извлечь из очереди N начальных элементов и вывести их значения (если очередь содержит менее N элементов, то извлечь все ее элементы). После извлечения элементов из очереди освобождать память, которую они занимали.
14. Создать очередь, информационными полями которой являются: длины катетов прямоугольного треугольника (два вещественных числа). Добавить в очередь сведения о новом треугольнике. Организовать просмотр данных очереди. Определить периметр треугольника в начале очереди.
15. Создать очередь, информационными полями которой являются: фамилия и средний бал студента. Добавить в очередь сведения о новом студенте. Организовать просмотр данных очереди.
16. Создать стек, информационными полями которого являются: название книги и количество страниц. Добавить в стек сведения о новой книге. Организовать просмотр данных стека и определить количество книг в стеке.
17. Создать стек, информационными полями которого являются: название горы и высота. Добавить в стек сведения о новой горе. Организовать просмотр данных стека и определить среднюю высоту гор.
18. Создать очередь, информационными полями которой являются: телефон и его цена. Удалить из очереди сведения о телефоне, которые были введены первыми. Организовать просмотр данных очереди.
19. Создать стек, информационными полями которого являются: фамилия и средний бал студента. Добавить в стек сведения о новом студенте. Организовать просмотр данных стека.
20. Создать стек из вещественных чисел. Определить максимальный элемент в стеке. Организовать просмотр данных стека.
21. Дано число D и указатели P1 и P2 на начало и конец очереди, содержащей не менее двух элементов. Добавить элемент со значением D в конец очереди и извлечь из очереди первый (начальный) элемент. Вывести значение извлеченного элемента и содержимое очереди. После извлечения элемента из очереди освободить память, занимаемую этим элементом.
22. Создать очередь, информационными полями которого являются: компьютер и объем его оперативной памяти. Удалить из очереди сведения о компьютере, которые были введены первыми. Организовать просмотр данных очереди и вычислить общий объем памяти компьютеров, записанных в очереди.
23. Дано число N (> 0) и набор из N чисел. Создать стек, содержащий исходные числа (последнее число будет вершиной стека), и вывести указатель на его вершину.
24. Создать очередь из вещественных чисел. Определить количество положительных значений элементов очереди. Организовать просмотр данных очереди.
25. Создать стек из целых чисел. Вычислить произведение нечётных значений элементов стека. Организовать просмотр данных стека.
26. Создать очередь из целых чисел. Определить количество нечетных значений элементов очереди. Организовать просмотр данных очереди.
27. Создать стек, информационными полями которого являются: фамилия и заработная плата сотрудника. Добавить в стек сведения о новом сотруднике. Организовать просмотр данных стека и определить среднюю заработную плату.

 


Дата добавления: 2021-07-19; просмотров: 458; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!