Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.30 KB | None | 0 0
  1. /*
  2.  * Задача 1.1. Число делится на NUM, остаток записывается в стек. Затем стек выводится.
  3.  * Ограничение программы - до UINT_MAX (2^32)
  4.  *
  5.  * Она же - Задача 1.2. Пашет, так как при неявном приведении типов выполняется перевод в двоичный код
  6.  * Ограничение - до -2^31
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <limits.h>
  12. #define NUM 2
  13.  
  14. /*              Реализация стека                                         */
  15. typedef struct _stack
  16. {
  17.     unsigned value;
  18.     struct _stack *next;
  19. } stack;
  20.  
  21. stack* new_stack ()                                                     //Конструктор стека
  22. {
  23.     stack* head = (stack*)malloc(sizeof(stack));
  24.     head->next = NULL;
  25.     return head;
  26. }
  27.  
  28. void push (stack **head, unsigned data)                                 //Добавление элемента a в стек
  29. {
  30.     stack* elem = (stack*)malloc(sizeof(stack));                            //Создали элемент
  31.     elem->value = data;
  32.     elem->next = (*head);                                               //Связываем со стеком
  33.     (*head) = elem;
  34. }
  35.  
  36. unsigned pop(stack **head)
  37. {                                                                       //Получение первого элемента и удаление его из стека
  38.     stack* prev = NULL;
  39.     unsigned val;
  40.     if ((*head)->next == NULL)
  41.     {
  42.         fprintf(stderr, "Attempt to extract an element from an empty stack\n");
  43.         exit(-1);
  44.     }
  45.     prev = (*head);
  46.     val = prev->value;
  47.     (*head) = (*head)->next;
  48.     free(prev);
  49.     return val;
  50. }
  51.  
  52. void print(const stack* head)
  53. {                                           //Печать стека
  54.     while (head->next != NULL)
  55.     {
  56.         printf("%d \n", head->value);
  57.         head = head->next;
  58.     }
  59. }
  60.  
  61. void stack_delete (stack **head)                                            //Деструктор стека
  62. {
  63.     while ((*head)->next)
  64.     {
  65.         pop(head);
  66.         *head = (*head)->next;
  67.     }
  68.     free(*head);
  69. }
  70.  
  71. int isEmpty (stack* head)                                                   //Проверка на пустоту
  72. {
  73.     if (head->next == NULL)
  74.     {
  75.         return 1;
  76.     }
  77.     else
  78.     {
  79.         return 0;
  80.     }
  81. }
  82.  
  83. int main ()
  84. {
  85.     printf("%u\n", UINT_MAX);
  86.     unsigned a = 0;
  87.     stack* s = new_stack();
  88.     scanf("%u", &a);
  89.     printf("%u\n", a);
  90.     if (!a)
  91.     {
  92.         printf("0");
  93.         return 0;
  94.     }
  95.     while (a)
  96.     {
  97.         push(&s, a % NUM);
  98.         a /= NUM;
  99.     }
  100.     while (!isEmpty(s))
  101.     {
  102.         printf("%u", pop(&s));
  103.     }
  104.     stack_delete(&s);
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement