7 15ЛР инфа
.docxЛабораторная работа №15
Стек, дек, очередь
Цель лабораторной работы: изучение способов создания и принципов использования динамических структур данных типа стек, дек, очередь; изучение стандартных средств языка C/C++ для работы с динамической памятью; совершенствование навыков модульного программирования на языке C/C++ при решении задач обработки линейных списков; совершенствование способов разработки многофайловых проектов.
Задание на программирование: используя технологию процедурного программирования разработать программу обработки данных, содержащихся в заранее подготовленном файле, в соответствии с индивидуальным заданием. Применить динамическую структуру указанного в задании вида: стек, очередь или дек.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание.
2) Разработать математическую модель: описать с помощью формул и рисунков вид используемой динамической структуры и процессы её создания и использования.
3) Построить схему алгоритма решения задачи.
4) Использовать функции, реализующие полный набор операций для этой структуры:
- допустимые операции для стека: инициализация, проверка на пустоту, добавление нового элемента в начало, извлечение элемента из начала;
- допустимые операции для очереди: инициализация, проверка на пустоту, добавление нового элемента в конец, извлечение элемента из начала;
- допустимые операции для дека: инициализация, проверка на пустоту, добавление нового элемента в начало, добавление нового элемента в конец, извлечение элемента из начала, извлечение элемента из конца.
5) Составить спецификации функций.
6) Создать многофайловый проект на языке C/C++.
7) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов. Обеспечить одновременный показ на экране содержимого входного и выходного файлов.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, спецификации функций, текст программы, контрольные примеры.
Формулировка задания:
(Вариант №16)
Дан текстовый файл. В текстовом файле записана формула следующего вида:
<Формула> ::= <Цифра> | M(<Формула>,<Формула>) | N(Формула>,<Формула>)
< Цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
где буквами обозначены функции:
M – определение максимума, N – определение минимума.
Используя стек, вычислить значение заданного выражения.
Текст программы
#include <iostream>
#include <fstream>
#include "Stack.h"
#include <conio.h>
#include <Windows.h>
using namespace std;
int main(int argc, const char * argv[]) {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
stack* s = NULL;
ifstream file("Input.txt");
if (!file) {
cout << "Ошибка открытия файла" << endl;
_getch();
return 1;
}
cout << "Формула: ";
char ch;
file >> ch;
cout << ch;
while (!file.eof()) {
if (empty(s)) {
s = push(ch, s);
file >> ch;
if (!file.eof()) {
cout << ch;
}
}
else {
if (ch - '0' >= 0 && ch - '0' <= 9) {
if (top(s) - '0' >= 0 && top(s) - '0' <= 9) {
char first = ch;
char second = pop(s);
char function = pop(s);
if (function == 'M') {
ch = first - '0' > second - '0' ? first : second;
}
else {
ch = first - '0' < second - '0' ? first : second;
}
}
else {
s = push(ch, s);
file >> ch;
cout << ch;
}
}
else {
if (ch == '(' || ch == ',' || ch == ')') {
file >> ch;
if (!file.eof()) {
cout << ch;
}
}
else {
s = push(ch, s);
file >> ch;
cout << ch;
}
}
}
}
cout << endl;
ofstream result("Output.txt");
ch = pop(s);
cout << "Результат вычисления формулы: " << ch << endl;
result << ch << endl;
_getch();
return 0;
}
//Заголовочный файл Stack.h
struct stack {
char data;
stack* next;
};
bool empty(stack* first);
stack* push(char e, stack* &first);
char pop(stack* &first);
char top(stack* &first);
//Исходный файл модуля работы со стеком Stack.cpp
#include <iostream>
#include "Stack.h"
using namespace std;
bool empty(stack* first) {
return (first == NULL);
}
stack* push(char e, stack* &first) {
stack* new_elem = new stack;
new_elem->data = e;
new_elem->next = first;
return new_elem;
}
char pop(stack* &first) {
char first_elem_data = first->data;
stack* second = first->next;
if (second != NULL) {
first->data = second->data;
first->next = second->next;
}
else {
first = NULL;
}
delete second;
return first_elem_data;
}
char top(stack* &first) {
char first_elem_data = first->data;
return first_elem_data;
}
Скриншот контрольного примера выполнения программы
Текстовый файл “Input.txt”, содержащий заданное, для вычисления с помощью стека, выражение.
Окно выполненной программы.
Текстовый файл “Output.txt”, содержащий результат выполнения выражения.