Here I use C with multiple digits estimation.
#include <stdio.h> #include <math.h> #define MAX 50 void push(char[],char); void in_push(double[], double); int pop(); int prec(char); double eval(char[],int,double[]); int top = 0; void main() { double eval_stack[MAX]; int op_count=0; char stack[MAX], exps[MAX], symbols[MAX]; int i=0,j=0,len,check; while((symbols[i]=getchar())!='\n') { if(symbols[i]!=' ' || symbols[i]!='\t') { if(symbols[i]=='+' || symbols[i]=='-' || symbols[i]=='/' || symbols[i]=='*' || symbols[i]=='^') op_count++; i++; } } symbols[i]='#'; symbols[++i]='\0'; len = strlen(symbols); stack[top] = '#'; for(i=0; i<=len; i++) { if(symbols[i]>='a' && symbols[i]<='z') { exps[j]=symbols[i]; j++; } switch(symbols[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': //if(symbols[i]>='a' && symbols[i]<='z') { exps[j]=symbols[i]; j++; break; case '+': case '-': case '*': case '/': case '^': exps[j++] = ' '; while(prec(symbols[i]) <= prec(stack[top])) { exps[j] = stack[top]; pop(); //printf("\n\t\t%d\t\t%d\n", top,j); j++; } if(prec(symbols[i]) > prec(stack[top])) { push(stack,symbols[i]); } break; case '(': push(stack,symbols[i]); break; case ')': while(stack[top]!='(') { exps[j] = stack[top]; pop(); j++; } pop(); break; case '#': exps[j++] = ' '; while(stack[top]!='#') { exps[j] = stack[top]; pop(); j++; } pop(); break; } } exps[j]='\0'; printf("Postfix: %s", exps); for(i=0; i<j; i++) if(exps[i]=='a') check = 1; if(check!=1) printf("\nSolution: %.1f", eval(exps,j,eval_stack)); } double eval(char exps[],int exps_len,double eval_stack[]) { int i; int len=exps_len,temp; double in_temp[MAX],t; int count,power,j,in_count; count=power=j=t=in_count=0; double result; for(i=0; i<len; i++) { switch(exps[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': in_temp[i] = exps[i]-'0'; j=i+1; while(exps[j]>='0' && exps[j]<='9') { in_temp[j] = exps[j]-'0'; j++; // 2 } count = i; // 3 while(in_temp[count]<='0' && in_temp[count]<='9') { power = (j-count)-1; t = t + in_temp[count]*(pow(10,power)); power--; count++; } in_push(eval_stack,t); i=j-1; t=0; break; case '+': temp = pop(); pop(); result = eval_stack[temp] + eval_stack[temp+1]; in_push(eval_stack,result); break; case '-': temp = pop(); pop(); result = eval_stack[temp] - eval_stack[temp+1]; in_push(eval_stack,result); break; case '*': temp = pop(); pop(); result = eval_stack[temp] * eval_stack[temp+1]; in_push(eval_stack,result); break; case '/': temp = pop(); pop(); result = eval_stack[temp] / eval_stack[temp+1]; in_push(eval_stack,result); break; case '^': temp = pop(); pop(); result = pow(eval_stack[temp],eval_stack[temp+1]); in_push(eval_stack,result); break; } } return eval_stack[top]; } int prec(char a) { if(a=='^') return 3; else if(a=='*' || a=='/' || a=='%') return 2; else if(a=='+' || a=='-') return 1; else if(a=='(') return 0; else return -1; } void push(char stack[], char ele) { if(top>=MAX) { printf("\nStack Overflow"); exit(1); } stack[++top] = ele; } void in_push(double stack[], double ele) { if(top>=MAX) { printf("\nStack Overflow"); exit(1); } stack[++top] = ele; } int pop() { if(top<0) { printf("\nStack Underflow"); exit(1); } top = top - 1; return top; }
rajatbarman
source share