Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <locale.h>
- #include <string>
- // определение структуры для элемента стека
- struct cell
- {
- double value; // значение в элемента
- struct cell* next; // указатель на следующий элемент
- };
- // определение имени list для типа cell
- typedef struct cell list;
- // функция создания списка
- list* modStack(double val)
- {
- list* newStack; // создание указателя на новый список
- newStack = new list; // выделение памяти под новый список
- newStack->value = val; // запись в ячейку значения элемента списка
- newStack->next = NULL; // запись в ячейку указателя NULL на следующий элемент
- return(newStack);
- }
- // функция вывода содержимого стека на экран
- void outputScreen(list* myStack)
- {
- int pos = 0; // индекс позиции элемента в стеке
- list* tmp = myStack; // указатель на стек
- if (tmp == NULL)
- {
- std::cout << "Стек пустой или не создан\n";
- }
- else
- {
- std::cout << "\n";
- do
- {
- pos++; // увеличение индекса позиции на 1
- std::cout << "-[" << pos << "]" << "(" << tmp->value << ")-"; // форматированный вывод элементов стека
- tmp = tmp->next; //присвоение tmp указателя на следующий элемент стека
- } while (tmp != NULL);
- }
- std::cout << "\n";
- return;
- }
- // функция вывода стека в указанный файл
- void outputFile(list* myStack, std::string fileName)
- {
- int pos = 0; // индекс позиции элемента в стеке
- std::ofstream output; // открытие потока на запись
- output.open(fileName, std::ios_base::trunc); // открытие файла для записи
- if (!output) // файл не открыт
- {
- std::cout << "Ошибка! Не удалось открыть/создать файл с указанным именем\n";
- return;
- }
- list* tmp = myStack; // указатель на стек
- output << "ВЫВОД: ";
- if (tmp == NULL)
- {
- output << "Стек пустой или не создан.\n";
- }
- else
- {
- do
- {
- pos++; // увеличение индекса позиции на 1
- output << "-[" << pos << "]" << "(" << tmp->value << ")-"; // форматированный вывод элементов списка
- tmp = tmp->next; //присвоение tmp указателя на следующий элемент списка
- } while (tmp != NULL);
- }
- output << "\n\n";
- output.close();
- std::cout << "Стек успешно выведен в файл " << fileName << "\n";
- return;
- }
- // функция очистки стека
- void clearList(list** myStack)
- {
- list* tmp = *myStack; // указатель на первый элемент стека
- list* tmpNext = NULL; // указатель на следующий элемент стека
- if (tmp == NULL)
- {
- std::cout << "Невозможно очистить пустой или не созданный стек\n";
- }
- else
- {
- do
- {
- tmpNext = tmp->next; // присвоение указателя на следующий элемент
- delete tmp; // удаление указателя на текущий элемент
- tmp = tmpNext; // присвоение текущему указателю указателя на следующий элемент
- } while (tmp != NULL);
- *myStack = NULL; // обнуление указателя на стек
- std::cout << "Стек успешно очищен\n";
- }
- return;
- }
- /*
- int findMax(list* myList)
- {
- list* tmp = myList; // указатель на список
- int max = 0; // максимальный элемент списка
- int posMax = 0; // позиция максимального элемента в списке
- int pos = 0; // позиция элемента в списке
- if (tmp == NULL) // указатель на список NULL
- {
- std::cout << "Невозможно найти максимальное число в пустом или не созданном списке\n";
- }
- else
- {
- max = tmp->value; // присвоение max первого значения элемента списка
- posMax = 1;
- pos = 1;
- do
- {
- if (tmp->value > max) // если текущее значение элемента больше max
- {
- max = tmp->value; // присвоение max текущего значения
- posMax = pos; // запоминание позиции текущего элемента
- }
- tmp = tmp->next; // переход к следующему элементу списка
- pos++; // увеличение индекса позиции на 1
- } while (tmp != NULL);
- std::cout << "Максимальный элемент - " << max << ", его позиция в списке - " << posMax << "\n";
- }
- return max; // вернуть максимальное значение
- }*/
- // функция извлечения элемента стека на заданной позиции
- void PopStack(list** myStack)
- {
- list* tmp = *myStack; // указатель на первый элемент стека
- list* tmpPrev = NULL; // указатель на предыдущий элемент стека
- int i = 1; // индексная переменная
- if (tmp == NULL) // указатель на первый элемент стека NULL
- {
- std::cout << "Невозможно извлечь элемент из пустого или не созданного стека\n";
- }
- else
- {
- if (tmp->next == NULL) // указатель на следующий элемент NULL
- {
- std::cout << "Элемент -[" << i << "]" << "(" << tmp->value << ")- извлечен из стека \n";
- clearList(myStack); // удаление всего стека из 1 элемента
- }
- else
- {
- do
- {
- i++; // увеличение счетчика на 1
- tmpPrev = tmp; // присвоение указателю на предыдущий элемент указателя на текущий элемент
- tmp = tmp->next; // присвоение указателю на текущий элемент указателя на следующий элемент
- } while (tmp->next != NULL);
- tmpPrev->next = NULL; // указателю на следующий элемент для i-1 элемента присвоить указатель NULL
- std::cout << "Элемент -[" << i << "]" << "(" << tmp->value << ")- извлечен из стека \n";
- delete tmp; // удаление указателя на извлеченный элемент
- }
- }
- return;
- }
- // функция добавления элемента в стек
- void PushStack(list** myStack, double val, int *maxSize)
- {
- list* tmp = *myStack; // указатель на первый элемент стека
- list* tmpPrev = NULL; // указатель на предыдущий элемент стека
- if (*maxSize == 5)
- {
- std::cout << "Стек уже содержит максимальное количество элементов - 5\n";
- return;
- }
- if (tmp == NULL)
- {
- std::cout << "Стек пустой. Создание нового стека...\n";
- *myStack = modStack(val); // создание стека с текущим элементом
- std::cout << "Новый стек успешно создан\n";
- }
- else
- {
- do
- {
- if (tmp->value == val) // добавляемое значение уже содержится в стеке
- {
- std::cout << "Невозможно добавить новый элемент. Элемент с введенным значением уже есть в стеке\n";
- return;
- }
- tmpPrev = tmp; // присвоение указателю на предыдущий элемент указателя на текущий элемент
- tmp = tmp->next; // присвоение указателю на текущий элемент указателя на следующий элемент
- } while (tmp != NULL); // указатель на текущий элемент NULL
- tmpPrev->next = modStack(val); // присвоение указателю предыдущего элемента на следующий элемент указателя на введенный элемент
- }
- (*maxSize)++;
- std::cout << "Новый элемент со значением " << val << " добавлен в конец стека\n";
- return;
- }
- int main()
- {
- setlocale(LC_ALL, "RUS");
- std::string command;
- std::string fileName;
- list* myStack = NULL; // инициализация указателя типа list
- double value = 0; // значение элемента стека
- int maxSize = 0;
- std::cout << "Введите команду для выполнения. Чтобы получить список допустимых команд, введите HELP.\n\n";
- while (1)
- {
- std::cout << "ВВОД: ";
- std::cin >> command;
- if (command == "HELP")
- {
- std::cout << "ВЫВОД:\n";
- std::cout << "Команда PRTSCR\n"
- << "Данная команда предназначена для вывода элементов стека на экран\n\n"
- << "Команда PRTFILE\n"
- << "Данная команда предназначена для вывода элементов стека в файл\n\n"
- << "Команда CLEAR\n"
- << "Данная команда предназначена для удаления стека целиком\n\n"
- << "Команда PUSH\n"
- << "Данная команда предназначена для добавления элемента в стек. После названия данной команды необходимо ввести значение элемента стека(пример: ADD 6) При этом, если стек не существует, то он будет создан.\n\n"
- << "Команда POP\n"
- << "Данная команда предназначена для извлчения элемента стека.\n\n"
- << "Команда ESCAPE\n"
- << "Данная команда предназначена для завершения работы программы, при этом существующий стек будет очищен";
- std::cout << "\n\n";
- continue;
- }
- if (command == "PRTSCR")
- {
- std::cout << "ВЫВОД: ";
- outputScreen(myStack);
- std::cout << "\n";
- continue;
- }
- if (command == "PRTFILE")
- {
- std::cin >> fileName;
- std::cout << "ВЫВОД: ";
- outputFile(myStack, fileName);
- std::cout << "\n";
- continue;
- }
- if (command == "CLEAR")
- {
- std::cout << "ВЫВОД: ";
- clearList(&myStack);
- std::cout << "\n";
- continue;
- }
- /*
- if (command == "FINDMAX")
- {
- std::cout << "ВЫВОД: ";
- findMax(myList);
- std::cout << "\n";
- continue;
- }*/
- if (command == "PUSH")
- {
- std::cin >> value;
- std::cout << "ВЫВОД: ";
- PushStack(&myStack, value, &maxSize);
- outputScreen(myStack);
- std::cout << "\n";
- continue;
- }
- if (command == "POP")
- {
- std::cout << "ВЫВОД: ";
- PopStack(&myStack);
- outputScreen(myStack);
- std::cout << "\n";
- continue;
- }
- if (command == "ESCAPE")
- {
- std::cout << "ВЫВОД: Завершение работы программы\n\n";
- break;
- }
- std::cout << "ВЫВОД: Команда не найдена\n\n";
- }
- clearList(&myStack); // очистка стека после завершения программы
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement