Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_lb4

.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
69 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №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;

}

6

Соседние файлы в папке 2 сем