Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.40 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #define MAXVAL 1000
  6. #define Number '0'
  7. int sp = 0;
  8. int i = 0;
  9. int last = 0;
  10. int k = 0;
  11. char val[MAXVAL];
  12. char array[MAXVAL];
  13.  
  14. char pop(void) {
  15. if (sp > 0) {
  16. sp--;
  17. return val[sp];
  18. }
  19. else {
  20. return -1;
  21. }
  22. }
  23.  
  24. void push(char f) {
  25. last = (f == '(') ? 0 : last;
  26. if (f == '*' || f == '/') {
  27. if (last == 2) {
  28. array[k] = pop();
  29. k++;
  30. array[k] = ' ';
  31. k++;
  32. }
  33. last = 2;
  34. }
  35. if (f == '+' || f == '-') {
  36. if (last != 0) {
  37. array[k] = pop();
  38. k++;
  39. array[k] = ' ';
  40. k++;
  41. }
  42. last = 1;
  43. }
  44. if (sp < MAXVAL) {
  45. val[sp] = f;
  46. sp++;
  47. }
  48. else {
  49. printf("стек переполнен");
  50. }
  51. }
  52.  
  53. char type(char b) {
  54. return ((int)b >= 48 && (int)b <= 57) ? Number : b;
  55. }
  56.  
  57. int main(void) {
  58. int j,count=0;
  59. int fin[MAXVAL];
  60. char in[2*MAXVAL];
  61. gets(in);
  62. long int N = strlen(in);
  63. if (N == 0) {
  64. printf("syntax error");
  65. return 0;
  66. }
  67. for (i = 0;i < N;i++) {
  68. if (type(in[i]) != Number && type(in[i - 1]) == Number && i>0) {
  69. array[k] = ' ';
  70. k++;
  71. }
  72. if ((type(in[N - 1]) != Number && in[N - 1]!='(' && in[N - 1]!=')') || (type(in[N-1])!=Number && type(in[N-2])!=Number && in[N-2]!=')')|| in[N - 1] == '(') {
  73. printf("syntax error");
  74. return 0;
  75. }
  76. if ((type(in[i]) != Number && in[i] != '(' && in[i] != ')') && (type(in[i - 1]) != Number && in[i-1] != '(' && in[i-1] != ')') && i > 0) {
  77. printf("syntax error");
  78. return 0;
  79. }
  80. switch (type(in[i]))
  81. {
  82. case Number:
  83. array[k] = in[i];
  84. k++;
  85. break;
  86. case '(':
  87. push(in[i]);
  88. count++;
  89. break;
  90. case '*':
  91. push(in[i]);
  92. break;
  93. case '/':
  94. push(in[i]);
  95. break;
  96. case '-':
  97. push(in[i]);
  98. break;
  99. case '+':
  100. push(in[i]);
  101. break;
  102. case ')':
  103. count--;
  104. if (in[i - 1] == '(') {
  105. printf("syntax error");
  106. return 0;
  107. }
  108. while (1) {
  109. array[k] = pop();
  110. if (array[k] == '(') {
  111. push(pop());
  112. break;
  113. }
  114. k++;
  115. array[k] = ' ';
  116. k++;
  117. }
  118. break;
  119. default:
  120. printf("syntax error");
  121. return 0;
  122. break;
  123. }
  124. }
  125. if (count !=0) {
  126. printf("syntax error");
  127. return 0;
  128. }
  129. int counter = 0;
  130. for (j = 0;j < k;j++) {
  131. in[j] = array[j];
  132. counter++;
  133. }
  134. for (j = sp - 1;j >= 0;j--) {
  135. in[counter] = ' ';
  136. counter++;
  137. in[counter] = val[j];
  138. counter++;
  139. }
  140. int counter1 = 0;
  141. long int summ = 0;
  142. for (i = 0;i < counter;i++) {
  143. //printf("%c", in[i]);
  144. if (type(in[i]) == Number) {
  145. summ = (summ * 10) + (int)in[i] % 48;
  146. continue;
  147. }
  148. else {
  149. if (in[i] == ' ' && type(in[i - 1]) == Number) {
  150. fin[counter1] = summ;
  151. summ = 0;
  152. counter1++;
  153. continue;
  154. }
  155. }
  156. switch (type(in[i]))
  157. {
  158. case '+':
  159. fin[counter1 - 2] = fin[counter1 - 1] + fin[counter1 - 2];
  160. counter1 = counter1 - 1;
  161. break;
  162. case '-':
  163. fin[counter1 - 2] = fin[counter1 - 2] - fin[counter1 - 1];
  164. counter1 = counter1 - 1;
  165. break;
  166. case '*':
  167. fin[counter1 - 2] = fin[counter1 - 1] * fin[counter1 - 2];
  168. counter1 = counter1 - 1;
  169. break;
  170. case '/':
  171. if (fin[counter1 - 1] == 0) {
  172. printf("division by zero");
  173. return 0;
  174. }
  175. fin[counter1 - 2] = fin[counter1 - 2] / fin[counter1 - 1];
  176. counter1 = counter1 - 1;
  177. break;
  178. }
  179. }
  180. if (fin[0] ==-858993460) {
  181. fin[0] = summ;
  182. }
  183. printf("%d", fin[0]);
  184. getchar();
  185. getchar();
  186. return 0;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement