Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_lb4
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №4
по дисциплине «Программирование»
Тема: Динамические структуры данных
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Азаревич А. Д. |
Санкт-Петербург
2023
Цель работы.
Знакомство с языком С++, классами и динамическими структурами данных, а также написание программы с использованием этих знаний.
Задание.
Вариант 4
Требуется написать программу, моделирующую работу стека на базе списка. Для этого необходимо:
1) Реализовать класс CustomStack, который будет содержать перечисленные ниже методы. Стек должен иметь возможность хранить и работать с типом данных int.
Перечень методов класса стека, которые должны быть реализованы:
void push(int val) - добавляет новый элемент в стек
void pop() - удаляет из стека последний элемент
int top() - возвращает верхний элемент
size_t size() - возвращает количество элементов в стеке
bool empty() - проверяет отсутствие элементов в стеке
2) Обеспечить в программе считывание из потока stdin последовательности команд (каждая команда с новой строки), в зависимости от которых программа выполняет ту или иную операцию и выводит результат ее выполнения с новой строки.
Перечень команд, которые подаются на вход программе в stdin:
сmd_push n - добавляет целое число n в стек. Программа должна вывести "ok"
сmd_pop - удаляет из стека последний элемент и выводит его значение на экран
сmd_top - программа должна вывести верхний элемент стека на экран, не удаляя его из стека
сmd_size - программа должна вывести количество элементов в стеке
сmd_exit - программа должна вывести "bye" и завершить работу
Если в процессе вычисления возникает ошибка (например вызов метода pop или top при пустом стеке), программа должна вывести "error" и завершиться.
Выполнение работы.
В начале был реализован класс CustomStack. У него есть приватное поле size_t mSize, которое хранит текущий размер стека, и защищённое поле ListNode *mHead, которое хранит указатель на верхний элемент в стеке. В конструкторе класса указателю на следующий элемент присваивается nullptr, а размеру стека присваивается 0. В деструкторе класса с помощью цикла удаляются элементы стека. Метод push принимает число, выделяет память под элемент списка, присваивает полю mData значение переданного числа, присваивает полю mNext указатель на голову, присваивает голове новый элемент писка, увеличивает размер стека на 1 и выводит на экран “ok”. Метод pop проверяет, является ли стек пустым, если нет, то следующий элемент становится головой, предыдущий удаляется и размер становится на 1 меньше, а если да, то выводится “error”, и программа завершается. Метод top проверяет, является ли стек пустым, если нет, то метод возвращает значение поля mData верхнего элемента, а если да, то выводится “error”, и программа завершается. Метод size возвращает значение поля mSize. Метод empty возвращает истину или ложь в равенстве между mHead и nullptr. В функции main создается элемент класса stack, затем объявляется строка command. Затем в цикле считывается команда, и с помощью else if вызываются нужные методы. Программа завершается вводом cmd_exit и выводит “bye”.
Разработанный программный код см. в приложении А.
Тестирование.
Результаты тестирования представлены в табл. 1.
Таблица 1 – Результаты тестирования
№ п/п |
Входные данные |
Выходные данные |
Комментарии |
1. |
cmd_push 1 cmd_top cmd_push 2 cmd_top cmd_pop cmd_size cmd_pop cmd_size cmd_exit |
ok 1 ok 2 2 1 1 0 bye |
Верно |
2. |
cmd_push 45 cmd_pop cmd_top cmd_exit |
ok 45 error |
Верно |
3. |
cmd_size cmd_push 27 cmd_push 62 cmd_push 0 cmd_top cmd_size cmd_exit |
0 ok ok ok 0 3 bye |
Верно |
Вывод.
В ходе выполнения лабораторной работы были изучены основные методы работы со стеком. В результате была написана программа на языке С++, демонстрирующая особенности языка и представляющая реализацию класса CustomStack на базе линейного списка, а также моделирующая работу со стеком при помощи методов класса.
ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: main_lb4.c
class CustomStack {
public:
CustomStack() {
mHead = nullptr;
mSize = 0;
}
~CustomStack() {
while (!empty()) {
pop();
}
}
void push(int val) {
ListNode* newNode = new ListNode;
newNode->mData = val;
newNode->mNext = mHead;
mHead = newNode;
mSize++;
cout << "ok" << endl;
}
void pop() {
if (empty()) {
cout << "error" << endl;
exit(0);
}
ListNode* temp = mHead;
mHead = mHead->mNext;
delete temp;
mSize--;
}
int top() {
if (empty()) {
cout << "error" << endl;
exit(0);
}
return mHead->mData;
}
size_t size() {
return mSize;
}
bool empty() {
return mHead == nullptr;
}
protected:
ListNode* mHead;
private:
size_t mSize;
};
int main() {
CustomStack stack;
string command;
while (cin >> command) {
if (command == "cmd_push") {
int val;
cin >> val;
stack.push(val);
}
else if (command == "cmd_pop") {
cout << stack.top() << endl;
stack.pop();
}
else if (command == "cmd_top") {
cout << stack.top() << endl;
}
else if (command == "cmd_size") {
cout << stack.size() << endl;
}
else if (command == "cmd_exit") {
cout << "bye" << endl;
exit(0);
}
}
return 0;
}
