Содержание
ВНИМАНИЕ | Для заказа программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
Постановка задания
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
Необходимо написать $3$ модуля, в совокупности содержащие решения $10$ задач для работы со стеками, очередями, деками, и программу, демонстрирующую работу этих модулей. Программа должна быть выполнена либо в качестве консольного приложения (тогда обязателен командно-текстовый интерфейс), либо иметь графический интерфейс пользователя.
Все задачи выполнять через функции, при необходимости можно использовать вспомогательные функции. В разработанных модулях не должны применяться интерфейсные функции, весь интерфейс реализуется демонстрационной программой.
В качестве данных, если не сказано иначе, брать последовательность случайных целых чисел (положительных и отрицательных). Желательно также предусмотреть ввод элементов списка с клавиатуры.
💡 Для студентов мы бесплатно закодировали модуль работы со стеком и программу, демонстрирующую работу этого модуля. Разработка велась в среде MS Visual Studio в виде консольного приложения с помощью языка программирования C++.
Общие сведения о стеке
Стек (stack) — динамическая структура данных, в которой все включения, исключения и доступ производятся только с одного конца по принципу LIFO (от англ. «Last In — First Out» — последним пришел, первым ушел). Стеки широко применяются в программировании для: передачи параметров в функции, трансляции, реализации рекурсии, реализации управления динамической памятью и др. Принцип работы стека легко понять на примере стопки тарелок: чтобы взять вторую тарелку сверху, нужно снять самую верхнюю. Список задач по моделированию стека:
|
Структура проекта
В результате кодирования данной задачи получился проект, состоящий из $3$ файлов:
- stack.h — пользовательские описания (типы данных и прототипы функций).
- stack.cpp — модуль для работы со стеком.
- source.cpp — программа, демонстрирующая работу модуля stack.cpp.
Реализация задачи на языке С++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #ifndef STACK_H #define STACK_H //-------------------------------------------------------------------------- // структура "Элемент стека" //-------------------------------------------------------------------------- struct TElem { int inf; // информационное поле TElem* next; // связующее поле }; //-------------------------------------------------------------------------- TElem* CreateElement(const int pinf); // создание элемента с заданным значением TElem* Push(TElem* ptop, const int pinf); // добавление элемента в вершину стека int Pop(TElem** ptop); // удаление элемента из вершины стека void Reverse(TElem** ptop); // реверсирование (переворачивание) стека void Print(TElem** ptop); // вывод элементов стека на экран (двойное переворачивание) void Clear(TElem** ptop); // очистка стека (удаление всех элементов) #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <iostream> #include "stack.h" using namespace std; //-------------------------------------------------------------------------- // создание элемента с заданным значением //-------------------------------------------------------------------------- TElem* CreateElement(const int pinf) { TElem* add = new TElem; add->inf = pinf; add->next = NULL; return add; } //-------------------------------------------------------------------------- // добавление элемента в вершину стека TElem* Push(TElem* ptop, const int pinf) { TElem* add = CreateElement(pinf); add->next = ptop; ptop = add; return ptop; } //-------------------------------------------------------------------------- // удаление элемента из вершины стека //-------------------------------------------------------------------------- int Pop(TElem** ptop) { TElem* del = *ptop; *ptop = del->next; int deleteInf = del->inf; delete del; del = NULL; // в качестве ответа возвращаем значение удаленного элемента return deleteInf; } //-------------------------------------------------------------------------- // реверсирование (переворачивание) стека //-------------------------------------------------------------------------- void Reverse(TElem** ptop) { TElem* newStack = NULL; while(*ptop != NULL) newStack = Push(newStack, Pop(ptop)); *ptop = newStack; } //-------------------------------------------------------------------------- // вывод элементов стека на экран (двойное переворачивание) //-------------------------------------------------------------------------- void Print(TElem** ptop) { cout << "Элементы стека имеют вид: "; TElem* newStack = NULL; while(*ptop != NULL) { int value = Pop(ptop); cout << "\t" << value; newStack = Push(newStack, value); } *ptop = newStack; Reverse(ptop); cout << endl; } //-------------------------------------------------------------------------- // очистка стека (удаление всех элементов) //-------------------------------------------------------------------------- void Clear(TElem** ptop) { TElem* del = *ptop; // пока в стеке остались элементы while(*ptop != NULL) { *ptop = del->next; delete del; del = *ptop; } *ptop = NULL; } //-------------------------------------------------------------------------- |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> // для ввода, вывода (cin, cout) #include <Windows.h> // для заголовка консольного окна #include "stack.h" // подключаем пользовательские описания // использование функций напрямую из стандартного пространства имен using namespace std; //-------------------------------------------------------------------------- // главное меню программы //-------------------------------------------------------------------------- int Menu(void) { int select; do { cout << "1 - ДОБАВЛЕНИЕ ЭЛЕМЕНТА В ВЕРШИНУ СТЕКА" << endl; cout << "2 - УДАЛЕНИЕ ЭЛЕМЕНТА ИЗ ВЕРШИНЫ СТЕКА" << endl; cout << "3 - РЕВЕРСИРОВАНИЕ (ПЕРЕВОРАЧИВАНИЕ) СТЕКА" << endl; cout << "4 - ПЕЧАТЬ ЭЛЕМЕНТОВ СТЕКА НА ЭКРАН" << endl; cout << "5 - ОЧИСТКА СТЕКА (УДАЛЕНИЕ ВСЕХ ЭЛЕМЕНТОВ)" << endl; cout << "6 - ВЫХОД" << endl; cout << "Выбор: "; cin >> select; } while((select < 1) || (select > 6)); cout << endl; return select; } //-------------------------------------------------------------------------- // ввод значения информационного поля элемента вводом с клавиатуры //-------------------------------------------------------------------------- int InputIntValue(void) { int value; cout << "Введите значение элемента стека (целое число): "; cin >> value; return value; } //-------------------------------------------------------------------------- // главная функция программы (точка входа) //-------------------------------------------------------------------------- int main(void) { TElem* top = NULL; // указатель на вершину стека int select; // хранит №пункта меню, выбранного пользователем setlocale(LC_ALL, "rus"); // настройка руссификации диалогов // настройка заголовка консольного окна static const TCHAR* title = TEXT("Практикум на ЭВМ. Структуры данных и алгоритмы. С++. Лабораторная работа №2 (стек)"); SetConsoleTitle(title); do { select = Menu(); // отображение главного меню пользователю switch(select) { case 1: // добавление элемента в вершину стека { if(top != NULL) Print(&top); top = Push(top, InputIntValue()); Print(&top); cout << "Элемент успешно добавлен в вершину стека."; break; } case 2: // удаление элемента из вершины стека { if(top == NULL) cout << endl << "Стек пуст (не содержит ни одного элемента)! Удаление элемента невозможно."; else { Print(&top); Pop(&top); Print(&top); cout << "Элемент успешно удален из вершины стека."; } break; } case 3: // реверсирование (переворот) стека { if(top == NULL) cout << endl << "Стек пуст (не содержит ни одного элемента)! Переворот стека невозможен."; else { Print(&top); Reverse(&top); Print(&top); cout << "Стек успешно реверсирован." << endl; } break; } case 4: // печать элементов стека на экран { if(top == NULL) cout << endl << "Стек пуст (не содержит ни одного элемента)! Печать элементов невозможна."; else Print(&top); break; } case 5: // очистка стека (удаление всех элементов) { Clear(&top); cout << endl << "Из стека успешно удалены все элементы (стек пуст)."; break; } } // если не выход, то делаем задержку программы, чтобы просмотреть результаты if(select != 6) { fflush(stdin); cout << endl << endl << "Для продолжения работы программы нажмите ENTER..."; cin.get(); } } while(select != 6); Clear(&top); // перед выходом из программы нужно подчистить память из-под стека return 0; // завершение работы программы и передача управления в ОС } |
Результаты работы программы
№ | Смысл операции и результат |
1 | ![]() |
2 | ![]() |
3 | ![]() |
4 | ![]() |
5 | ![]() |
6 | ![]() |
7 | ![]() |
8 | ![]() |
9 | ![]() |
10 | ![]() |
11 | ![]() |
Стоимость заказа работы
№ | Структура данных | Консольный формат | Визуальный формат |
1 | Стек | Бесплатно (см. реализацию выше) | $800$ рублей |
2 | Очередь | $600$ рублей | $800$ рублей |
3 | Дек | $600$ рублей | $800$ рублей |
➡ Стоимость детального алгоритма из любого варианта составляет $1\ 000$ рублей (заказывается опционально на ваше усмотрение, чтобы детально разобраться с решением лабораторной работы, например, не прибегая к консультации репетитора).
Также дополнительно вы можете заказать у нас:
- Построение аккуратной ГОСТовой блок-схемы. Ориентировочная стоимость $1\ 000$ рублей.
- Отчет о проделанной работе (иногда в вузах есть требование — предоставить отчет к лабораторной работе). Ориентировочная стоимость $500$ рублей.
ВНИМАНИЕ | Для заказа программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |