fork download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<ctype.h>
  4. #include<math.h>
  5. #include<string.h>
  6.  
  7. //*in - input array
  8. //* postfix - array for psuedo postfix expression
  9. //* valArr - array for stoaring values in expression
  10. char in[200],postfix[200], opSt[50];
  11. float valArr[50],evalSt[20];
  12. int opTop =-1,vTop =-1,eTop=-1;
  13.  
  14.  
  15.  
  16.  
  17. char pushOp(char c){
  18. if(opTop <199){
  19. opTop++;
  20. opSt[opTop] = c;
  21. return opSt[opTop];
  22. }else{
  23. printf("opStack Overflow Error!!!\n");
  24. return 0;
  25. }
  26. }
  27. float pushVal(float val){
  28. if(vTop <49){
  29. vTop++;
  30. valArr[vTop] =val;
  31. return valArr[vTop];
  32. }else{
  33. printf("valArrack Overflow Error!!!\n");
  34. return 0;
  35. }
  36. }
  37. float pushEval(float val){
  38. if(eTop <19){
  39. eTop++;
  40. evalSt[eTop] =val;
  41. return evalSt[eTop];
  42. }else{
  43. printf("evalArrack Overflow Error!!!\n");
  44. return 0;
  45. }
  46. }
  47.  
  48. char popOp(){
  49.  
  50. if(opTop !=-1){
  51. char val = opSt[opTop];
  52. opTop--;
  53. return val;
  54. }else{
  55. printf("opStack Empty Error!!!\n");
  56. return 0;
  57. }
  58.  
  59. }
  60.  
  61. float popVal(){
  62.  
  63. if(vTop !=-1){
  64. float val = valArr[vTop];
  65. vTop--;
  66. return val;
  67. }else{
  68. printf("valArr Empty Error!!!\n");
  69. return 0;
  70. }
  71.  
  72. }
  73. float popEval(){
  74.  
  75. if(eTop !=-1){
  76. float val = evalSt[eTop];
  77. eTop--;
  78. return val;
  79. }else{
  80. printf("evalStack Empty Error!!!\n");
  81. return 0;
  82. }
  83.  
  84. }
  85.  
  86.  
  87.  
  88.  
  89. //* Actual Infix Array
  90. char infix[250];
  91.  
  92. //* prepares the input array for converting to postifx array
  93. void prepParse(){
  94.  
  95. char pre;
  96. int i =0,j=0;
  97. if(in[i]=='-'){
  98. infix[j++] = '(';
  99. infix[j++] = '0';
  100. infix[j++] = '-';
  101. infix[j++] = in[++i];
  102. infix[j++] = ')';
  103. i++;
  104. }
  105. while(in[i]!='\0'){
  106. if(isdigit(in[i])||in[i] =='.'){
  107. infix[j] = in[i];
  108. i++;
  109. j++;
  110. pre = in[i];
  111. }else if(in[i] == '*' && in[i+1] == '*'){
  112. infix[j] = 'E';
  113. j++;i+=2;
  114. pre = in[i];
  115. }else if(in[i] == '-' && (pre == '+'||pre == '-'||pre == '*'||pre == '/'||pre == '%'||pre == 'e'||pre == 'E')){
  116. infix[j++] = '(';
  117. infix[j++] = '0';
  118. infix[j++] = '-';
  119. infix[j++] = in[++i];
  120. infix[j++] = ')';
  121. i++;
  122. }else{
  123. infix[j] = in[i];
  124. j++;i++;
  125. }
  126.  
  127.  
  128. }
  129.  
  130.  
  131.  
  132. }
  133.  
  134. //* converts numbers in in array to float number
  135. float parseVal(int k){
  136. int dec =0;
  137. float val = 0.0;
  138. while(isdigit(infix[k])){
  139. val = val*10 + (float)(infix[k]-'0');
  140. k++;
  141. }
  142.  
  143. if(infix[k] == '.'){
  144. k++;
  145. while(isdigit(infix[k])){
  146. val = val*10 + (float)(infix[k]-'0');
  147. k++;
  148. dec++;
  149. }}
  150. val = nextafterf(val/pow(10,dec),val+1);
  151. pushVal(val);
  152. return k;
  153. }
  154.  
  155.  
  156. int priority(char c){
  157. if(c == 'e' || c =='E'){
  158. return 4;
  159. }else if(c =='*'||c=='/'||c == '%'){
  160. return 3;
  161. }else if(c =='+'||c =='-'){
  162. return 2;
  163. }else {
  164. return 1;
  165. }
  166. }
  167.  
  168.  
  169.  
  170. //* convers infix operation to psuedo operation
  171. void convert(){
  172.  
  173. int i =0,j=0,len=0;
  174. float val =0.0;
  175. char x,t;
  176. x = infix[0];
  177. while(x!='\0'){
  178.  
  179. if(isdigit(x)){
  180. i = parseVal(i)-1;
  181. postfix[j] = 'a';
  182. j++;
  183. }else if(x =='('){
  184. pushOp(x);
  185. }else if(x==')'){
  186. t=popOp();
  187.  
  188. while(t != '('){
  189.  
  190. postfix[j] = t;
  191. j++;
  192. t = popOp();
  193. }
  194. }else if(x == '+'||x == '-'||x == '*'||x == '/'||x == '%'||x == 'e'||x == 'E'){
  195. if(opTop ==-1||priority(x)>priority(opSt[opTop])){
  196. pushOp(x);
  197. }else{
  198. while(opTop!=-1 && priority(x)<=priority(opSt[opTop])){
  199. t = popOp();
  200. postfix[j] = t;
  201. j++;
  202. }
  203.  
  204. pushOp(x);
  205. }
  206. }
  207. i++;
  208. x = infix[i];
  209.  
  210.  
  211.  
  212. }
  213.  
  214. while(opTop!= -1){
  215. t = popOp();
  216. postfix[j] = t;
  217. j++;
  218. }
  219. }
  220.  
  221. void eval(){
  222. int temp =0,i=0;
  223. char op;
  224. float t =0.0,op1,op2;
  225. while(temp <vTop/2 +1){
  226. t = valArr[temp];
  227. valArr[temp] = valArr[vTop-temp];
  228. valArr[vTop-temp] = t;
  229. temp++;
  230. }
  231. op = postfix[i];
  232. while( op != '\0'){
  233. if(postfix[i] == 'a'){
  234. pushEval(popVal());
  235. }else{
  236. op2 = popEval();
  237. op1 = popEval();
  238. switch(op){
  239. case '+':{ pushEval(op1+op2);break;}
  240. case '-':{pushEval(op1-op2);break;}
  241. case '*':{pushEval(op1*op2);break;}
  242. case '/':{pushEval(op1/op2);break;}
  243. case '%':{pushEval((int)op1%(int)op2);break;}
  244. case 'e':
  245. case 'E' : {pushEval(pow(op1,op2));break;}
  246. }
  247. }
  248. op = postfix[++i];
  249. }
  250.  
  251.  
  252. }
  253. void main(){
  254.  
  255. float val;
  256. printf("Give the expression\n");
  257. scanf("%s",in);
  258. prepParse();
  259. convert();
  260. eval();
  261. val = popEval();
  262. printf("Answer is %f \n",nexttoward(val,val+1));
  263. }
Runtime error #stdin #stdout 0s 4544KB
stdin
(4+8)*(6-5)/((3-2)*(2+5))
stdout
Give the expression
Answer is -0.214286