Advertisement
baadgeorge

Untitled

Feb 18th, 2021
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.00 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 >= 4)
  185. {
  186. std::cout << "Стек уже содержит максимальное количество элементов - 20\n";
  187. return;
  188. }
  189.  
  190. if (tmp == NULL)
  191. {
  192. std::cout << "Стек пустой. Создание нового стека...\n";
  193. *myStack = modStack(val); // создание стека с текущим элементом
  194. std::cout << "Новый стек успешно создан\n";
  195. *maxSize = 1;
  196. }
  197. else
  198. {
  199. do
  200. {
  201. if (tmp->value == val) // добавляемое значение уже содержится в стеке
  202. {
  203. std::cout << "Невозможно добавить новый элемент. Элемент с введенным значением уже есть в стеке\n";
  204. return;
  205. }
  206. tmpPrev = tmp; // присвоение указателю на предыдущий элемент указателя на текущий элемент
  207. tmp = tmp->next; // присвоение указателю на текущий элемент указателя на следующий элемент
  208. *(maxSize)++;
  209. } while (tmp != NULL); // указатель на текущий элемент NULL
  210. tmpPrev->next = modStack(val); // присвоение указателю предыдущего элемента на следующий элемент указателя на введенный элемент
  211. }
  212. std::cout << "Новый элемент со значением " << val << " добавлен в конец стека\n";
  213. return;
  214. }
  215.  
  216. int main()
  217. {
  218. setlocale(LC_ALL, "RUS");
  219.  
  220. std::string command;
  221. std::string fileName;
  222. list* myStack = NULL; // инициализация указателя типа list
  223. double value = 0; // значение элемента стека
  224. int maxSize = 0;
  225. std::cout << "Введите команду для выполнения. Чтобы получить список допустимых команд, введите HELP.\n\n";
  226.  
  227. while (1)
  228. {
  229. std::cout << "ВВОД: ";
  230. std::cin >> command;
  231.  
  232. if (command == "HELP")
  233. {
  234. std::cout << "ВЫВОД:\n";
  235. std::cout << "Команда PRTSCR\n"
  236. << "Данная команда предназначена для вывода элементов стека на экран\n\n"
  237.  
  238. << "Команда PRTFILE\n"
  239. << "Данная команда предназначена для вывода элементов стека в файл\n\n"
  240.  
  241. << "Команда CLEAR\n"
  242. << "Данная команда предназначена для удаления стека целиком\n\n"
  243.  
  244. << "Команда PUSH\n"
  245. << "Данная команда предназначена для добавления элемента в стек. После названия данной команды необходимо ввести значение элемента стека(пример: ADD 6) При этом, если стек не существует, то он будет создан.\n\n"
  246.  
  247. << "Команда POP\n"
  248. << "Данная команда предназначена для извлчения элемента стека.\n\n"
  249.  
  250. << "Команда ESCAPE\n"
  251. << "Данная команда предназначена для завершения работы программы, при этом существующий стек будет очищен";
  252. std::cout << "\n\n";
  253. continue;
  254. }
  255. if (command == "PRTSCR")
  256. {
  257. std::cout << "ВЫВОД: ";
  258. outputScreen(myStack);
  259. std::cout << "\n";
  260. continue;
  261. }
  262. if (command == "PRTFILE")
  263. {
  264. std::cin >> fileName;
  265. std::cout << "ВЫВОД: ";
  266. outputFile(myStack, fileName);
  267. std::cout << "\n";
  268. continue;
  269. }
  270. if (command == "CLEAR")
  271. {
  272. std::cout << "ВЫВОД: ";
  273. clearList(&myStack);
  274. std::cout << "\n";
  275. continue;
  276. }
  277. /*
  278. if (command == "FINDMAX")
  279. {
  280. std::cout << "ВЫВОД: ";
  281. findMax(myList);
  282. std::cout << "\n";
  283. continue;
  284. }*/
  285. if (command == "PUSH")
  286. {
  287. std::cin >> value;
  288. std::cout << "ВЫВОД: ";
  289. PushStack(&myStack, value, &maxSize);
  290. outputScreen(myStack);
  291. std::cout << "\n";
  292. continue;
  293. }
  294. if (command == "POP")
  295. {
  296. std::cout << "ВЫВОД: ";
  297. PopStack(&myStack);
  298. outputScreen(myStack);
  299. std::cout << "\n";
  300. continue;
  301. }
  302. if (command == "ESCAPE")
  303. {
  304. std::cout << "ВЫВОД: Завершение работы программы\n\n";
  305. break;
  306. }
  307. std::cout << "ВЫВОД: Команда не найдена\n\n";
  308. }
  309. clearList(&myStack); // очистка стека после завершения программы
  310.  
  311. system("pause");
  312. return 0;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement