fork download
  1. # include <stdlib.h>
  2. # include <unistd.h>
  3.  
  4. typedef struct s_list
  5. {
  6. struct s_strlist *next;
  7. char *item;
  8.  
  9. } t_list;
  10.  
  11. void ft_putstr(char **str)
  12. {
  13. while (*str)
  14. {
  15. write(1, &(*str), 1);
  16. str++;
  17. }
  18. }
  19.  
  20. void printlist(t_list *list)
  21. {
  22. if (!list)
  23. return ;
  24. t_list *l;
  25. l = list;
  26. while (l)
  27. {
  28. ft_putstr(&(l->item));
  29. l = l->next;
  30. write(1, ' ', 1);
  31. }
  32. }
  33.  
  34. char *findint(char *str)
  35. {
  36. char *res = malloc(12*sizeof(char));
  37. int i = 0;
  38.  
  39. while (*str && *str >= '0' && *str <= '9' && *str != ' ')
  40. {
  41. res[i] = *str;
  42. i++;
  43. str++;
  44. }
  45. return (res);
  46. }
  47.  
  48. void ft_list_reverse(t_list **begin_list)
  49. {
  50. t_list *a;
  51. t_list *b;
  52.  
  53. if (!(*begin_list))
  54. return ;
  55. a = NULL;
  56. while (*begin_list)
  57. {
  58. b = (*begin_list)->next;
  59. (*begin_list)->next = a;
  60. a = *begin_list;
  61. *begin_list = b;
  62. }
  63. }
  64.  
  65. t_list *add_link(char *item, t_list *list)
  66. {
  67. t_list *el;
  68.  
  69. el = (t_list*)malloc(sizeof(t_list));
  70. el->item = malloc(12);
  71. el->item = item;
  72. el->next = list;
  73. return (el);
  74. }
  75.  
  76. t_list *pop(t_list *list)
  77. {
  78. t_list *tmp;
  79.  
  80. tmp = list->next;
  81. free(list);
  82. return (tmp);
  83. }
  84.  
  85. t_list *convert(char *str)
  86. {
  87. t_list *list;
  88. t_list *res;
  89. char *s;
  90.  
  91. list = NULL;
  92. res = NULL;
  93. while (*str)
  94. {
  95. if (*str >= '0' && *str <= '9') //добавление цифорок
  96. {
  97. s = findint(str);
  98. res = add_link(s, res);
  99. }
  100. if (*str == '/' || *str == '*' || *str == '%') //два оператора одной важности не могут стоять вместе
  101. {
  102. if (list != NULL && (list->item == '/' || list->item == '*' || list->item == '%'))
  103. {
  104. res = add_link(list->item, res);
  105. list = pop(list);
  106. }
  107. list = add_link(*str, list);
  108. }
  109. if (*str == '+' || *str == '-') // младшие операторы не могут быть рядом с корешами и высшими знаками
  110. {
  111. while (list != NULL && list->item != '(')
  112. {
  113. s = list->item;
  114. list = pop(list);
  115. res = add_link(s, res);
  116. }
  117. list = add_link(*str, list);
  118. }
  119. if (*str == ')') //после закрывающей скобочки попаем оперторы помещенные внутрь
  120. {
  121. while (list != NULL && list->item != '(')
  122. {
  123. s = list->item;
  124. list = pop(list);
  125. res = add_link(s, res);
  126. }
  127. list = pop(list);
  128. }
  129. if (*str == '(')
  130. list = add_link(*str, list);
  131. str++;
  132. printlist(list);
  133. write(1, "\n", 1);
  134. printlist(res);
  135. write(1, "\n", 1);
  136. }
  137. }
  138.  
  139. int main()
  140. {
  141. char *str = "(1 + 2 / 3 * (4 + 5) - 6)";
  142. t_list *g = convert(str);
  143. while (g)
  144. {
  145. ft_putstr(g->item);
  146. g = g->next;
  147. }
  148. return 0;
  149. }
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
(

(
0
(
0
+(
0
+(
0
+(
�0
+(
�0
/+(
�0
/+(
�0
/+(
�0
/+(
�0
*+(
/�0
*+(
/�0
(*+(
/�0
(*+(
p/�0
(*+(
p/�0
+(*+(
p/�0
+(*+(
p/�0
+(*+(
�p/�0
*+(
+�p/�0
*+(
+�p/�0
-(
+*+�p/�0
-(
+*+�p/�0
-(
+*+�p/�0

-+*+�p/�0