
2392_Смирнова_М_ЛР1
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра АПУ
отчет
по лабораторной работе 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. Методы
rans
- Внутри функции "trans"
с помощью функций "isupper" и "islower"
проверяется, является ли символ "c"
заглавной или строчной буквой
соответственно. Если символ "c"
является заглавной буквой, то с помощью
функции "tolower" он преобразуется в
строчную букву и возвращается из функции.
Если символ "c" является строчной
буквой, то с помощью функции "toupper"
он преобразуется в заглавную букву и
также возвращается из функции.
Если символ "c" не
является ни заглавной, ни строчной
буквой, то он остается без изменений и
также возвращается из функции.
Рисунок 4. Стеки
и переменная
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;}