Advertisement
Pohuyumer

LAB 2.10 ATTACHMENT

Jun 6th, 2020
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.69 KB | None | 0 0
  1. #include <cstdio>
  2. #include <windows.h>
  3.  
  4. typedef double TInfo;
  5.  
  6. struct TElem {
  7.     TInfo Info;          // информация в стеке
  8.     struct TElem* Next;  // указатель на следующий элемент стека
  9. };
  10.  
  11. TInfo PopStack(TElem** stack) {     // извлечь информацию из стека и удалить элемент
  12.     TElem* Elem = *stack;           // создаем копию вершины переданного стека
  13.     TInfo Info = Elem->Info;        // сохраняем в Info данные последнего введенного эл-та
  14.     *stack = Elem->Next;            // ставим указатель на следующий эл-т(удаляя тем самым предыдущий)
  15.     delete Elem;                    // удаляем доп. стек
  16.     return Info;                    // возвращаем Info
  17. }
  18.  
  19. TElem* push_stack(TElem* stack, TInfo info) {          // добавить в стек
  20.     if (stack == NULL) {                               // если стек нулевой, то
  21.         TElem* Elem = (TElem*)malloc(sizeof(TElem));    // создаем новый элемент
  22.         Elem->Info = info;                              // передаем в него информацию
  23.         Elem->Next = NULL;                              // перед новым элеиентом ничего нет
  24.         return Elem;                                    // возвращаем созданный элемент
  25.     }
  26.     else {                                              // иначе
  27.         TElem* Elem = (TElem*)malloc(sizeof(TElem));    // создаем новый элемент
  28.         Elem->Info = info;                              // передаем в него информацию
  29.         Elem->Next = (stack);                          // указывает на предыдущий элемент
  30.         return Elem;                                    // возвращаем созданный элемент
  31.     }
  32. }
  33.  
  34. void TopToTop(TElem** PSt1, TElem** PSt2) {
  35.     // перекладывание элемента из одного стека (StTop) в другой(Dop)
  36.     TElem* Elem, * StTop = *PSt1, * Dop = *PSt2;   // создаем копии стеков
  37.     Elem = StTop;                                  // Elem - доп. копия первого стека
  38.     StTop = StTop->Next;                           // ставим указатель на следующий элемент
  39.     Elem->Next = Dop;                              // добавляется верхний элемент из первого стека во второй(сохраняется в дополнит. стеке)
  40.     Dop = Elem;                                    // второй стек равняеется дополнит. стеку (верх. элем. первого + второй стек)
  41.     *PSt1 = StTop; *PSt2 = Dop;                    // сохранить новые адреса вершин по адресам PSt1 и PSt2
  42. }
  43.  
  44.  
  45. void create_stack(TElem** stack, FILE* f, int* kol) { // заполнить стек информацией
  46.     double info;
  47.  
  48.     (*stack) = NULL;                                  // изначально: пустой
  49.     while (!feof(f)) {                                // пока не достиг конца файла
  50.         fscanf(f, "%lf", &info);                      // считать информацию из файла и записать в info
  51.         if (ftell(f) != 0) {                        // если файл не пустой
  52.             (*stack) = push_stack(*stack, info);      // записать информацию в стек
  53.             (*kol)++;                                 // подсчет количества элементов стека
  54.         }
  55.     }
  56. }
  57.  
  58. void print_c(TElem* stack) {                // вывод стека в консоль
  59.     TElem* Elem = stack;                    // создаем копию вершины переданного стека
  60.     if (!Elem) printf(" пустой.");         // если пустой, то выводим соответствующее сообщение
  61.     else {                                  // иначе
  62.         printf("\n");
  63.         while (Elem) {                    // пока не пустой
  64.             printf("%lf ", Elem->Info);     // печатаем информацию
  65.             Elem = Elem->Next;              // переходим к следующему элементу
  66.         }
  67.     }
  68.     printf("\n");
  69. }
  70.  
  71. void print_f(TElem* stack, FILE* f) {       // вывод стека в файл
  72.     TElem* Elem = stack;                    // создаем копию вершины переданного стека
  73.     if (!Elem) fprintf(f, " пустой.");       // если пустой, то выводим соответствующее сообщение
  74.     else {                                  // иначе
  75.         fprintf(f, "\n");
  76.         while (Elem) {                      // пока не пустой
  77.             fprintf(f, "%lf ", Elem->Info); // печатаем информацию
  78.             Elem = Elem->Next;              // переходим к следующему элементу
  79.         }
  80.     }
  81.     fprintf(f, "\n");
  82. }
  83.  
  84. TElem* free_stack(TElem** stack) {  // освободить стек
  85.     TInfo Info;
  86.     while (*stack) {                // пока стек не пустой
  87.         Info = PopStack(stack);     // извлекается информация и удаляется элемент
  88.     }
  89.     return *stack;                  // возвращаем пустой стек
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement