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

2392_Смирнова_М_ЛР1

.docx
Скачиваний:
0
Добавлен:
05.12.2024
Размер:
389.99 Кб
Скачать

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

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

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

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

Кафедра АПУ

отчет

по лабораторной работе 1

по дисциплине «Алгоритмы и Структуры Данных»

Тема: Линейная Структура Данных «Стек» и Операции над ним

Студентка гр. 2392

Смирнова М. В.

Преподаватель

Ряскова Е. Б.

Санкт-Петербург

2023

Постановка задачи.

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

Ход решения.

Рисунок 1. Стек и конструктор

О писывается структура стека: индекс вершины, данные и максимальный размер стека. Значение индекса вершины равняется -1 из-за пустоты стека.

Stack – создается конструктор стека.

IsEmpty смотря на текущие значения, проверка на пустоту стека.

IsFull смотря на текущие значения, проверка на заполненность стека.

Push – если есть еще место, то добавление нового элемента, иначе “Exceeded the number of characters in the stack!”

Pop – если в стеке есть элементы, то удаляет самый верхний элемент, иначе “There is nothing in the stack.”

Peek – если в стеке есть элементы, то возвращает верхний элемент, иначе “There is nothing in the stack.”, значение -1.

Рисунок 3. Индивидуальное задание

Рисунок 2. Методы

T rans - Внутри функции "trans" с помощью функций "isupper" и "islower" проверяется, является ли символ "c" заглавной или строчной буквой соответственно. Если символ "c" является заглавной буквой, то с помощью функции "tolower" он преобразуется в строчную букву и возвращается из функции. Если символ "c" является строчной буквой, то с помощью функции "toupper" он преобразуется в заглавную букву и также возвращается из функции. Если символ "c" не является ни заглавной, ни строчной буквой, то он остается без изменений и также возвращается из функции.

Рисунок 4. Стеки и переменная

M ain - Переменная для размера стека. Инициализируем два стека, и объявляется переменная variable для хранения символов.

Рисунок 5. Заполнение двух стеков

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

Рисунок 6. Вывод на экран

В ывод стеков на экран: пока стек не пустой, вывод символ с вершины с помощью peek, после удаление текущего символа благодаря pop.

Р езультат работы.

Вывод.

В процессе выполнения лабораторной работы я ознакомилась с концепцией "стека", приобрел практические навыки выполнения операций с ним и изучил правила программной реализации стека с использованием статического массива.

Приложение Код программы

#include <iostream>

#include <cctype>

using namespace std;

struct Stack {

char* data;

int head;

int mxdimension;

Stack(int size) {

mxdimension = size;

data = new char[mxdimension];

head = -1;}

~Stack() {

delete[] data;}

bool isEmpty() {

return head == -1;}

bool isFull() {

return head == mxdimension - 1;}

void push(char element) {

if (isFull()) {

std::cout << "Exceeded the number of characters in the stack!" << std::endl;}

else {

data[++head] = element;}}

void pop() {

if (isEmpty()) {

std::cout << "There is nothing in the stack." << std::endl;}

else {

--head;}}

char peek() {

if (isEmpty()) {

cout << "There is nothing in the stack." << endl;

return -1;

}

else {

return data[head];}}};

char trans(char c) {

if (isupper(c)) {

return tolower(c);

}

else if (islower(c)) {

return toupper(c);

}

else {

return c;

}

}

int main() {

int maxdem;

cout << "Enter the stack size: ";

cin >> maxdem;

Stack stack1(maxdem);

Stack stack2(maxdem);

char variable;

do{

cout << "Enter symbol: " << endl;

cin >> variable;

variable = trans(variable);

if (isupper(variable)) {

if (stack1.isFull()) {

cout << "Stack is full" << endl;}

else {

stack1.push(variable);}}

else if (islower(variable)) {

if (stack2.isFull()) {

cout << "Stack is full" << endl;}

else {

stack2.push(variable);}}

else {

cout << "This symbol is not a letter." << endl;}

} while (!stack1.isFull() || !stack2.isFull());

cout << "Contents of the first stack: ";

while (!stack1.isEmpty()) {

cout << stack1.peek() << " ";

stack1.pop();}

cout << std::endl;

cout << "Contents of the second stack: ";

while (!stack2.isEmpty()) {

cout << stack2.peek() << " ";

stack2.pop();

}

cout << std::endl;

return 0;}