Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. t_list_str *shunting_yard(char *str, t_list_str **operator_stack, t_list_str **input, char **av)
  2. {
  3. int i;
  4. int j;
  5. char *nbr;
  6.  
  7. i = 0;
  8. p = 0;
  9. while (str[i] != '')
  10. {
  11. if (str[i] > 47 && str[i] < 58 && str[i] != '')
  12. {
  13. nbr = grab_nbr(str, i, size_nbr(str, i));
  14. put_in_stack(nbr, input, "NB");
  15. i = i + size_nbr(str, i);
  16. }
  17. else
  18. {
  19. nbr = malloc(sizeof(char) * 2);
  20. nbr[1] = '';
  21. nbr[0] = str[i];
  22. if (*operator_stack == NULL)
  23. put_in_stack(nbr, operator_stack, "OP");
  24. else if (give_priority(nbr, av) == 6)
  25. go_to_opening_parentis(operator_stack, input, av);
  26. else if (check_precedence(nbr, (*operator_stack)->data, av) == 1)
  27. put_in_stack(nbr, operator_stack, "OP");
  28. else if (check_precedence(nbr, (*operator_stack)->data, av) == 0)
  29. put_operator_input(nbr, *operator_stack, *input, av);
  30. else
  31. put_in_stack(nbr, operator_stack, "OP");
  32. i = i + 1;
  33. // my_print_strlist(*operator_stack);
  34. printf("n");
  35. // my_print_strlist(*input);
  36. }
  37. }
  38. }
  39. int put_in_stack(char *nbr, t_list_str **stack, char *type)
  40. {
  41. t_list_str *temp;
  42.  
  43. temp = malloc(sizeof(t_list_str));
  44. if (temp == NULL)
  45. return (84);
  46. temp->data = my_strdup(nbr);
  47. temp->type = my_strdup(type);
  48. temp->next = *stack;
  49. *stack = temp;
  50. return (0);
  51. }
  52. int go_to_opening_parentis(t_list_str **operator_stack, t_list_str **input_for_comput, char **av)
  53. {
  54. t_list_str *temp;
  55. char c[2];
  56.  
  57. c[1] = '';
  58. temp = *operator_stack;
  59. while (temp->data[0] != av[2][0])
  60. {
  61. put_in_stack(temp->data, input_for_comput, "OP");
  62. temp = temp->next;
  63. }
  64. if (temp->next != NULL)
  65. *operator_stack = temp->next;
  66. else
  67. *operator_stack = NULL;
  68. return (0);
  69. }
  70.  
  71. int put_operator_input(char *c, t_list_str *operator_stack, t_list_str *input, char **av)
  72. {
  73. while (check_precedence(c, operator_stack->data, av) != 1)
  74. {
  75. put_in_stack(operator_stack->data, &input, "OP");
  76. operator_stack = operator_stack->next;
  77. }
  78. if (operator_stack != NULL)
  79. put_in_stack(c, &operator_stack, "0P");
  80. return (0);
  81. }
  82. int size_nbr(char *str, int i)
  83. {
  84. int size;
  85.  
  86. size = 0;
  87. while (str[i] > 47 && str[i] < 58 && str[i] != '')
  88. {
  89. size = size + 1;
  90. i = i + 1;
  91. }
  92. printf("size%dn",size);
  93. return (size);
  94. }
  95. char *grab_nbr(char *str, int i , int size)
  96. {
  97. char *nbr;
  98. int j;
  99.  
  100. j = 0;
  101. nbr = malloc(sizeof(char) * (size + 1));
  102. if (nbr == NULL)
  103. return (NULL);
  104. nbr[size] = '';
  105. while (str[i] > 47 && str[i] < 58 && str[i] != '')
  106. {
  107. nbr[j] = str[i];
  108. j = j + 1;
  109. i = i + 1;
  110. }
  111. return (nbr);
  112. }
  113.  
  114. int give_priority(char *c, char **av)
  115. {
  116. // if (c[0] == '!')
  117. //return (1);
  118. if (c[0] == av[2][2]) // '+'
  119. return (1);
  120. if (c[0] == av[2][3]) // '-'
  121. return (1);
  122. if (c[0] == av[2][4])
  123. return (2);
  124. if (c[0] == av[2][5])
  125. return (3);
  126. if (c[0] == av[2][6]) //
  127. return (4);
  128. if (c[0] == av[2][0]) // '('
  129. return (5);
  130. if (c[0] == av[2][1]) // ')'
  131. return (6);
  132. }
  133.  
  134. int check_precedence(char *c, char *data, char **av)
  135. {
  136. int priority_c;
  137. int priority_data;
  138.  
  139. priority_c = give_priority(c, av);
  140. priority_data = give_priority(data, av);
  141.  
  142. if ((priority_data <= priority_c && priority_c != 6 || priority_data == 5))
  143. return (1);
  144. if (priority_data > priority_c)
  145. return (0);
  146. }
  147.  
  148. t_list_str *link_input_operator(t_list_str **input_for_comput, t_list_str **operator_stack)
  149. {
  150. t_list_str *temp;
  151.  
  152. temp = NULL;
  153. temp = *operator_stack;
  154. while (temp != NULL)
  155. {
  156. put_in_stack(temp->data, input_for_comput, "OP");
  157. temp = temp->next;
  158. }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement