Advertisement
baadgeorge

Untitled

Jun 7th, 2021
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <locale.h>
  4. #include <string>
  5.  
  6. // определение структуры для элемента стека
  7. struct cell
  8. {
  9. double value; // значение в элемента
  10. struct cell* next; // указатель на следующий элемент
  11. };
  12.  
  13. // определение имени list для типа cell
  14. typedef struct cell list;
  15.  
  16. // функция создания списка
  17. list* modStack(double val)
  18. {
  19. list* newStack; // создание указателя на новый список
  20. newStack = new list; // выделение памяти под новый список
  21. newStack->value = val; // запись в ячейку значения элемента списка
  22. newStack->next = NULL; // запись в ячейку указателя NULL на следующий элемент
  23. return(newStack);
  24. }
  25.  
  26. // функция вывода содержимого стека на экран
  27. void outputScreen(list* myStack)
  28. {
  29. int pos = 0; // индекс позиции элемента в стеке
  30. list* tmp = myStack; // указатель на стек
  31. if (tmp == NULL)
  32. {
  33. std::cout << "Стек пустой или не создан\n";
  34. }
  35. else
  36. {
  37. std::cout << "\n";
  38. do
  39. {
  40. pos++; // увеличение индекса позиции на 1
  41. std::cout << "-[" << pos << "]" << "(" << tmp->value << ")-"; // форматированный вывод элементов стека
  42. tmp = tmp->next; //присвоение tmp указателя на следующий элемент стека
  43. } while (tmp != NULL);
  44. }
  45.  
  46. std::cout << "\n";
  47. return;
  48. }
  49.  
  50. // функция вывода стека в указанный файл
  51. void outputFile(list* myStack, std::string fileName)
  52. {
  53. int pos = 0; // индекс позиции элемента в стеке
  54. std::ofstream output; // открытие потока на запись
  55. output.open(fileName, std::ios_base::trunc); // открытие файла для записи
  56.  
  57. if (!output) // файл не открыт
  58. {
  59. std::cout << "Ошибка! Не удалось открыть/создать файл с указанным именем\n";
  60. return;
  61. }
  62.  
  63. list* tmp = myStack; // указатель на стек
  64. output << "ВЫВОД: ";
  65. if (tmp == NULL)
  66. {
  67. output << "Стек пустой или не создан.\n";
  68. }
  69. else
  70. {
  71. do
  72. {
  73. pos++; // увеличение индекса позиции на 1
  74. output << "-[" << pos << "]" << "(" << tmp->value << ")-"; // форматированный вывод элементов списка
  75. tmp = tmp->next; //присвоение tmp указателя на следующий элемент списка
  76. } while (tmp != NULL);
  77. }
  78.  
  79. output << "\n\n";
  80. output.close();
  81.  
  82. std::cout << "Стек успешно выведен в файл " << fileName << "\n";
  83. return;
  84. }
  85.  
  86. // функция очистки стека
  87. void clearList(list** myStack)
  88. {
  89. list* tmp = *myStack; // указатель на первый элемент стека
  90. list* tmpNext = NULL; // указатель на следующий элемент стека
  91. if (tmp == NULL)
  92. {
  93. std::cout << "Невозможно очистить пустой или не созданный стек\n";
  94. }
  95. else
  96. {
  97. do
  98. {
  99. tmpNext = tmp->next; // присвоение указателя на следующий элемент
  100. delete tmp; // удаление указателя на текущий элемент
  101. tmp = tmpNext; // присвоение текущему указателю указателя на следующий элемент
  102. } while (tmp != NULL);
  103. *myStack = NULL; // обнуление указателя на стек
  104. std::cout << "Стек успешно очищен\n";
  105. }
  106.  
  107. return;
  108. }
  109.  
  110.  
  111. /*
  112. int findMax(list* myList)
  113. {
  114. list* tmp = myList; // указатель на список
  115. int max = 0; // максимальный элемент списка
  116. int posMax = 0; // позиция максимального элемента в списке
  117. int pos = 0; // позиция элемента в списке
  118.  
  119. if (tmp == NULL) // указатель на список NULL
  120. {
  121. std::cout << "Невозможно найти максимальное число в пустом или не созданном списке\n";
  122. }
  123. else
  124. {
  125. max = tmp->value; // присвоение max первого значения элемента списка
  126. posMax = 1;
  127. pos = 1;
  128. do
  129. {
  130. if (tmp->value > max) // если текущее значение элемента больше max
  131. {
  132. max = tmp->value; // присвоение max текущего значения
  133. posMax = pos; // запоминание позиции текущего элемента
  134. }
  135. tmp = tmp->next; // переход к следующему элементу списка
  136. pos++; // увеличение индекса позиции на 1
  137. } while (tmp != NULL);
  138. std::cout << "Максимальный элемент - " << max << ", его позиция в списке - " << posMax << "\n";
  139. }
  140.  
  141. return max; // вернуть максимальное значение
  142. }*/
  143.  
  144. // функция извлечения элемента стека на заданной позиции
  145. void PopStack(list** myStack)
  146. {
  147. list* tmp = *myStack; // указатель на первый элемент стека
  148. list* tmpPrev = NULL; // указатель на предыдущий элемент стека
  149. int i = 1; // индексная переменная
  150.  
  151. if (tmp == NULL) // указатель на первый элемент стека NULL
  152. {
  153. std::cout << "Невозможно извлечь элемент из пустого или не созданного стека\n";
  154. }
  155. else
  156. {
  157. if (tmp->next == NULL) // указатель на следующий элемент NULL
  158. {
  159. std::cout << "Элемент -[" << i << "]" << "(" << tmp->value << ")- извлечен из стека \n";
  160. clearList(myStack); // удаление всего стека из 1 элемента
  161. }
  162. else
  163. {
  164. do
  165. {
  166. i++; // увеличение счетчика на 1
  167. tmpPrev = tmp; // присвоение указателю на предыдущий элемент указателя на текущий элемент
  168. tmp = tmp->next; // присвоение указателю на текущий элемент указателя на следующий элемент
  169. } while (tmp->next != NULL);
  170.  
  171. tmpPrev->next = NULL; // указателю на следующий элемент для i-1 элемента присвоить указатель NULL
  172. std::cout << "Элемент -[" << i << "]" << "(" << tmp->value << ")- извлечен из стека \n";
  173. delete tmp; // удаление указателя на извлеченный элемент
  174. }
  175. }
  176. return;
  177. }
  178.  
  179. // функция добавления элемента в стек
  180. void PushStack(list** myStack, double val, int *maxSize)
  181. {
  182. list* tmp = *myStack; // указатель на первый элемент стека
  183. list* tmpPrev = NULL; // указатель на предыдущий элемент стека
  184. if (*maxSize == 5)
  185. {
  186. std::cout << "Стек уже содержит максимальное количество элементов - 5\n";
  187. return;
  188. }
  189.  
  190. if (tmp == NULL)
  191. {
  192. std::cout << "Стек пустой. Создание нового стека...\n";
  193. *myStack = modStack(val); // создание стека с текущим элементом
  194. std::cout << "Новый стек успешно создан\n";
  195. }
  196. else
  197. {
  198. do
  199. {
  200. if (tmp->value == val) // добавляемое значение уже содержится в стеке
  201. {
  202. std::cout << "Невозможно добавить новый элемент. Элемент с введенным значением уже есть в стеке\n";
  203. return;
  204. }
  205. tmpPrev = tmp; // присвоение указателю на предыдущий элемент указателя на текущий элемент
  206. tmp = tmp->next; // присвоение указателю на текущий элемент указателя на следующий элемент
  207. } while (tmp != NULL); // указатель на текущий элемент NULL
  208. tmpPrev->next = modStack(val); // присвоение указателю предыдущего элемента на следующий элемент указателя на введенный элемент
  209. }
  210. (*maxSize)++;
  211. std::cout << "Новый элемент со значением " << val << " добавлен в конец стека\n";
  212. return;
  213. }
  214.  
  215. int main()
  216. {
  217. setlocale(LC_ALL, "RUS");
  218.  
  219. std::string command;
  220. std::string fileName;
  221. list* myStack = NULL; // инициализация указателя типа list
  222. double value = 0; // значение элемента стека
  223. int maxSize = 0;
  224. std::cout << "Введите команду для выполнения. Чтобы получить список допустимых команд, введите HELP.\n\n";
  225.  
  226. while (1)
  227. {
  228. std::cout << "ВВОД: ";
  229. std::cin >> command;
  230.  
  231. if (command == "HELP")
  232. {
  233. std::cout << "ВЫВОД:\n";
  234. std::cout << "Команда PRTSCR\n"
  235. << "Данная команда предназначена для вывода элементов стека на экран\n\n"
  236.  
  237. << "Команда PRTFILE\n"
  238. << "Данная команда предназначена для вывода элементов стека в файл\n\n"
  239.  
  240. << "Команда CLEAR\n"
  241. << "Данная команда предназначена для удаления стека целиком\n\n"
  242.  
  243. << "Команда PUSH\n"
  244. << "Данная команда предназначена для добавления элемента в стек. После названия данной команды необходимо ввести значение элемента стека(пример: ADD 6) При этом, если стек не существует, то он будет создан.\n\n"
  245.  
  246. << "Команда POP\n"
  247. << "Данная команда предназначена для извлчения элемента стека.\n\n"
  248.  
  249. << "Команда ESCAPE\n"
  250. << "Данная команда предназначена для завершения работы программы, при этом существующий стек будет очищен";
  251. std::cout << "\n\n";
  252. continue;
  253. }
  254. if (command == "PRTSCR")
  255. {
  256. std::cout << "ВЫВОД: ";
  257. outputScreen(myStack);
  258. std::cout << "\n";
  259. continue;
  260. }
  261. if (command == "PRTFILE")
  262. {
  263. std::cin >> fileName;
  264. std::cout << "ВЫВОД: ";
  265. outputFile(myStack, fileName);
  266. std::cout << "\n";
  267. continue;
  268. }
  269. if (command == "CLEAR")
  270. {
  271. std::cout << "ВЫВОД: ";
  272. clearList(&myStack);
  273. std::cout << "\n";
  274. continue;
  275. }
  276. /*
  277. if (command == "FINDMAX")
  278. {
  279. std::cout << "ВЫВОД: ";
  280. findMax(myList);
  281. std::cout << "\n";
  282. continue;
  283. }*/
  284. if (command == "PUSH")
  285. {
  286. std::cin >> value;
  287. std::cout << "ВЫВОД: ";
  288. PushStack(&myStack, value, &maxSize);
  289. outputScreen(myStack);
  290. std::cout << "\n";
  291. continue;
  292. }
  293. if (command == "POP")
  294. {
  295. std::cout << "ВЫВОД: ";
  296. PopStack(&myStack);
  297. outputScreen(myStack);
  298. std::cout << "\n";
  299. continue;
  300. }
  301. if (command == "ESCAPE")
  302. {
  303. std::cout << "ВЫВОД: Завершение работы программы\n\n";
  304. break;
  305. }
  306. std::cout << "ВЫВОД: Команда не найдена\n\n";
  307. }
  308. clearList(&myStack); // очистка стека после завершения программы
  309.  
  310. system("pause");
  311. return 0;
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement