#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<string.h>
//*in - input array
//* postfix - array for psuedo postfix expression
//* valArr - array for stoaring values in expression
char in[200],postfix[200], opSt[50];
float valArr[50],evalSt[20];
int opTop =-1,vTop =-1,eTop=-1;
char pushOp(char c){
if(opTop <199){
opTop++;
opSt[opTop] = c;
return opSt[opTop];
}else{
printf("opStack Overflow Error!!!\n"); return 0;
}
}
float pushVal(float val){
if(vTop <49){
vTop++;
valArr[vTop] =val;
return valArr[vTop];
}else{
printf("valArrack Overflow Error!!!\n"); return 0;
}
}
float pushEval(float val){
if(eTop <19){
eTop++;
evalSt[eTop] =val;
return evalSt[eTop];
}else{
printf("evalArrack Overflow Error!!!\n"); return 0;
}
}
char popOp(){
if(opTop !=-1){
char val = opSt[opTop];
opTop--;
return val;
}else{
printf("opStack Empty Error!!!\n"); return 0;
}
}
float popVal(){
if(vTop !=-1){
float val = valArr[vTop];
vTop--;
return val;
}else{
printf("valArr Empty Error!!!\n"); return 0;
}
}
float popEval(){
if(eTop !=-1){
float val = evalSt[eTop];
eTop--;
return val;
}else{
printf("evalStack Empty Error!!!\n"); return 0;
}
}
//* Actual Infix Array
char infix[250];
//* prepares the input array for converting to postifx array
void prepParse(){
char pre;
int i =0,j=0;
if(in[i]=='-'){
infix[j++] = '(';
infix[j++] = '0';
infix[j++] = '-';
infix[j++] = in[++i];
infix[j++] = ')';
i++;
}
while(in[i]!='\0'){
infix[j] = in[i];
i++;
j++;
pre = in[i];
}else if(in[i] == '*' && in[i+1] == '*'){
infix[j] = 'E';
j++;i+=2;
pre = in[i];
}else if(in[i] == '-' && (pre == '+'||pre == '-'||pre == '*'||pre == '/'||pre == '%'||pre == 'e'||pre == 'E')){
infix[j++] = '(';
infix[j++] = '0';
infix[j++] = '-';
infix[j++] = in[++i];
infix[j++] = ')';
i++;
}else{
infix[j] = in[i];
j++;i++;
}
}
}
//* converts numbers in in array to float number
float parseVal(int k){
int dec =0;
float val = 0.0;
val = val*10 + (float)(infix[k]-'0');
k++;
}
if(infix[k] == '.'){
k++;
val = val*10 + (float)(infix[k]-'0');
k++;
dec++;
}}
val
= nextafterf
(val
/pow(10,dec
),val
+1); pushVal(val);
return k;
}
int priority(char c){
if(c == 'e' || c =='E'){
return 4;
}else if(c =='*'||c=='/'||c == '%'){
return 3;
}else if(c =='+'||c =='-'){
return 2;
}else {
return 1;
}
}
//* convers infix operation to psuedo operation
void convert(){
int i =0,j=0,len=0;
float val =0.0;
char x,t;
x = infix[0];
while(x!='\0'){
i = parseVal(i)-1;
postfix[j] = 'a';
j++;
}else if(x =='('){
pushOp(x);
}else if(x==')'){
t=popOp();
while(t != '('){
postfix[j] = t;
j++;
t = popOp();
}
}else if(x == '+'||x == '-'||x == '*'||x == '/'||x == '%'||x == 'e'||x == 'E'){
if(opTop ==-1||priority(x)>priority(opSt[opTop])){
pushOp(x);
}else{
while(opTop!=-1 && priority(x)<=priority(opSt[opTop])){
t = popOp();
postfix[j] = t;
j++;
}
pushOp(x);
}
}
i++;
x = infix[i];
}
while(opTop!= -1){
t = popOp();
postfix[j] = t;
j++;
}
}
void eval(){
int temp =0,i=0;
char op;
float t =0.0,op1,op2;
while(temp <vTop/2 +1){
t = valArr[temp];
valArr[temp] = valArr[vTop-temp];
valArr[vTop-temp] = t;
temp++;
}
op = postfix[i];
while( op != '\0'){
if(postfix[i] == 'a'){
pushEval(popVal());
}else{
op2 = popEval();
op1 = popEval();
switch(op){
case '+':{ pushEval(op1+op2);break;}
case '-':{pushEval(op1-op2);break;}
case '*':{pushEval(op1*op2);break;}
case '/':{pushEval(op1/op2);break;}
case '%':{pushEval((int)op1%(int)op2);break;}
case 'e':
case 'E' : {pushEval
(pow(op1
,op2
));break;} }
}
op = postfix[++i];
}
}
void main(){
float val;
printf("Give the expression\n"); prepParse();
convert();
eval();
val = popEval();
printf("Answer is %f \n",nexttoward
(val
,val
+1)); }
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPGN0eXBlLmg+CiNpbmNsdWRlPG1hdGguaD4KI2luY2x1ZGU8c3RyaW5nLmg+CgovLyppbiAtIGlucHV0IGFycmF5Ci8vKiBwb3N0Zml4IC0gYXJyYXkgZm9yIHBzdWVkbyBwb3N0Zml4IGV4cHJlc3Npb24KLy8qIHZhbEFyciAtIGFycmF5IGZvciBzdG9hcmluZyB2YWx1ZXMgaW4gZXhwcmVzc2lvbgpjaGFyIGluWzIwMF0scG9zdGZpeFsyMDBdLCBvcFN0WzUwXTsKZmxvYXQgdmFsQXJyWzUwXSxldmFsU3RbMjBdOwppbnQgb3BUb3AgPS0xLHZUb3AgPS0xLGVUb3A9LTE7CgoKCgpjaGFyIHB1c2hPcChjaGFyIGMpewogICAgaWYob3BUb3AgPDE5OSl7CiAgICAgICAgb3BUb3ArKzsKICAgICAgICBvcFN0W29wVG9wXSA9IGM7CiAgICAgICAgcmV0dXJuIG9wU3Rbb3BUb3BdOwogICAgfWVsc2V7CiAgICAgICAgcHJpbnRmKCJvcFN0YWNrIE92ZXJmbG93IEVycm9yISEhXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KfQpmbG9hdCBwdXNoVmFsKGZsb2F0IHZhbCl7CiAgICBpZih2VG9wIDw0OSl7CiAgICAgICAgdlRvcCsrOwogICAgICAgIHZhbEFyclt2VG9wXSA9dmFsOwogICAgICAgIHJldHVybiB2YWxBcnJbdlRvcF07CiAgICB9ZWxzZXsKICAgICAgICBwcmludGYoInZhbEFycmFjayBPdmVyZmxvdyBFcnJvciEhIVxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KZmxvYXQgcHVzaEV2YWwoZmxvYXQgdmFsKXsKICAgIGlmKGVUb3AgPDE5KXsKICAgICAgICBlVG9wKys7CiAgICAgICAgZXZhbFN0W2VUb3BdID12YWw7CiAgICAgICAgcmV0dXJuIGV2YWxTdFtlVG9wXTsKICAgIH1lbHNlewogICAgICAgIHByaW50ZigiZXZhbEFycmFjayBPdmVyZmxvdyBFcnJvciEhIVxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCmNoYXIgcG9wT3AoKXsKCiAgICBpZihvcFRvcCAhPS0xKXsKICAgICAgICBjaGFyIHZhbCA9IG9wU3Rbb3BUb3BdOwogICAgICAgIG9wVG9wLS07CiAgICAgICAgcmV0dXJuIHZhbDsKICAgIH1lbHNlewogICAgICAgIHByaW50Zigib3BTdGFjayBFbXB0eSBFcnJvciEhIVxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cgp9CgpmbG9hdCBwb3BWYWwoKXsKCiAgICBpZih2VG9wICE9LTEpewogICAgICAgIGZsb2F0IHZhbCA9IHZhbEFyclt2VG9wXTsKICAgICAgICB2VG9wLS07CiAgICAgICAgcmV0dXJuIHZhbDsKICAgIH1lbHNlewogICAgICAgIHByaW50ZigidmFsQXJyIEVtcHR5IEVycm9yISEhXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCn0KZmxvYXQgcG9wRXZhbCgpewoKICAgIGlmKGVUb3AgIT0tMSl7CiAgICAgICAgZmxvYXQgdmFsID0gZXZhbFN0W2VUb3BdOwogICAgICAgIGVUb3AtLTsKICAgICAgICByZXR1cm4gdmFsOwogICAgfWVsc2V7CiAgICAgICAgcHJpbnRmKCJldmFsU3RhY2sgRW1wdHkgRXJyb3IhISFcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKfQoKCgoKLy8qIEFjdHVhbCBJbmZpeCBBcnJheQpjaGFyIGluZml4WzI1MF07CgovLyogcHJlcGFyZXMgdGhlIGlucHV0IGFycmF5IGZvciBjb252ZXJ0aW5nIHRvIHBvc3RpZnggYXJyYXkKdm9pZCBwcmVwUGFyc2UoKXsKCiAgICBjaGFyIHByZTsKICAgIGludCBpID0wLGo9MDsKICAgIGlmKGluW2ldPT0nLScpewogICAgICAgIGluZml4W2orK10gPSAnKCc7CiAgICAgICAgaW5maXhbaisrXSA9ICcwJzsKICAgICAgICBpbmZpeFtqKytdID0gJy0nOwogICAgICAgIGluZml4W2orK10gPSBpblsrK2ldOwogICAgICAgIGluZml4W2orK10gPSAnKSc7CiAgICAgICAgaSsrOwogICAgfQogICAgd2hpbGUoaW5baV0hPSdcMCcpewogICAgICAgIGlmKGlzZGlnaXQoaW5baV0pfHxpbltpXSA9PScuJyl7CiAgICAgICAgICAgIGluZml4W2pdID0gaW5baV07CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgICAgICBwcmUgPSBpbltpXTsKICAgICAgICB9ZWxzZSBpZihpbltpXSA9PSAnKicgJiYgaW5baSsxXSA9PSAnKicpewogICAgICAgICAgICBpbmZpeFtqXSA9ICdFJzsKICAgICAgICAgICAgaisrO2krPTI7CiAgICAgICAgICAgIHByZSA9IGluW2ldOwogICAgICAgIH1lbHNlIGlmKGluW2ldID09ICctJyAmJiAocHJlID09ICcrJ3x8cHJlID09ICctJ3x8cHJlID09ICcqJ3x8cHJlID09ICcvJ3x8cHJlID09ICclJ3x8cHJlID09ICdlJ3x8cHJlID09ICdFJykpewogICAgICAgICAgICBpbmZpeFtqKytdID0gJygnOwogICAgICAgICAgICBpbmZpeFtqKytdID0gJzAnOwogICAgICAgICAgICBpbmZpeFtqKytdID0gJy0nOwogICAgICAgICAgICBpbmZpeFtqKytdID0gaW5bKytpXTsKICAgICAgICAgICAgaW5maXhbaisrXSA9ICcpJzsKICAgICAgICAgICAgaSsrOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBpbmZpeFtqXSA9IGluW2ldOwogICAgICAgICAgICBqKys7aSsrOwogICAgICAgIH0KCgogICAgfQoKCgp9CgovLyogY29udmVydHMgbnVtYmVycyBpbiBpbiBhcnJheSB0byBmbG9hdCBudW1iZXIKZmxvYXQgcGFyc2VWYWwoaW50IGspewogICAgaW50IGRlYyA9MDsKICAgIGZsb2F0IHZhbCA9IDAuMDsKICAgIHdoaWxlKGlzZGlnaXQoaW5maXhba10pKXsKICAgICAgICB2YWwgPSB2YWwqMTAgKyAoZmxvYXQpKGluZml4W2tdLScwJyk7CiAgICAgICAgaysrOwogICAgfQogICAKICAgIGlmKGluZml4W2tdID09ICcuJyl7CiAgICAgICAgIGsrKzsKICAgIHdoaWxlKGlzZGlnaXQoaW5maXhba10pKXsKICAgICAgICB2YWwgPSB2YWwqMTAgKyAoZmxvYXQpKGluZml4W2tdLScwJyk7CiAgICAgICAgaysrOwogICAgICAgIGRlYysrOwogICAgfX0KICAgIHZhbCA9IG5leHRhZnRlcmYodmFsL3BvdygxMCxkZWMpLHZhbCsxKTsKICAgIHB1c2hWYWwodmFsKTsKICAgIHJldHVybiBrOwp9CgoKaW50IHByaW9yaXR5KGNoYXIgYyl7CiAgICBpZihjID09ICdlJyB8fCBjID09J0UnKXsKICAgICAgICByZXR1cm4gNDsKICAgIH1lbHNlIGlmKGMgPT0nKid8fGM9PScvJ3x8YyA9PSAnJScpewogICAgICAgIHJldHVybiAzOwogICAgfWVsc2UgaWYoYyA9PScrJ3x8YyA9PSctJyl7CiAgICAgICAgcmV0dXJuIDI7CiAgICB9ZWxzZSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cn0KCgoKLy8qIGNvbnZlcnMgaW5maXggb3BlcmF0aW9uIHRvIHBzdWVkbyBvcGVyYXRpb24Kdm9pZCBjb252ZXJ0KCl7CgogICAgaW50IGkgPTAsaj0wLGxlbj0wOwogICAgZmxvYXQgdmFsID0wLjA7CiAgICBjaGFyIHgsdDsKICAgIHggPSBpbmZpeFswXTsKICAgIHdoaWxlKHghPSdcMCcpewoKICAgICAgICBpZihpc2RpZ2l0KHgpKXsKICAgICAgICAgICAgaSA9IHBhcnNlVmFsKGkpLTE7CiAgICAgICAgICAgIHBvc3RmaXhbal0gPSAnYSc7CiAgICAgICAgICAgIGorKzsgICAgCiAgICAgICAgfWVsc2UgaWYoeCA9PScoJyl7CiAgICAgICAgICAgIHB1c2hPcCh4KTsKICAgICAgICB9ZWxzZSBpZih4PT0nKScpewogICAgICAgICAgICB0PXBvcE9wKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICB3aGlsZSh0ICE9ICcoJyl7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcG9zdGZpeFtqXSA9IHQ7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICB0ID0gcG9wT3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHggPT0gJysnfHx4ID09ICctJ3x8eCA9PSAnKid8fHggPT0gJy8nfHx4ID09ICclJ3x8eCA9PSAnZSd8fHggPT0gJ0UnKXsKICAgICAgICAgICAgaWYob3BUb3AgPT0tMXx8cHJpb3JpdHkoeCk+cHJpb3JpdHkob3BTdFtvcFRvcF0pKXsKICAgICAgICAgICAgICAgIHB1c2hPcCh4KTsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB3aGlsZShvcFRvcCE9LTEgJiYgcHJpb3JpdHkoeCk8PXByaW9yaXR5KG9wU3Rbb3BUb3BdKSl7CiAgICAgICAgICAgICAgICAgICAgdCA9IHBvcE9wKCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdGZpeFtqXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwdXNoT3AoeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICAgIHggPSBpbmZpeFtpXTsKICAgICAgIAoKICAgICAgICAKICAgIH0KICAgIAogICAgIHdoaWxlKG9wVG9wIT0gLTEpewogICAgICAgIHQgPSBwb3BPcCgpOwogICAgICAgIHBvc3RmaXhbal0gPSB0OwogICAgICAgIGorKzsKICAgIH0KfQoKdm9pZCBldmFsKCl7CiAgICBpbnQgdGVtcCA9MCxpPTA7CiAgICBjaGFyIG9wOwogICAgZmxvYXQgdCA9MC4wLG9wMSxvcDI7CiAgICB3aGlsZSh0ZW1wIDx2VG9wLzIgKzEpewogICAgICAgIHQgPSB2YWxBcnJbdGVtcF07CiAgICAgICAgdmFsQXJyW3RlbXBdID0gdmFsQXJyW3ZUb3AtdGVtcF07CiAgICAgICAgIHZhbEFyclt2VG9wLXRlbXBdID0gdDsKICAgICAgICAgdGVtcCsrOwogICAgfQogICAgb3AgPSBwb3N0Zml4W2ldOwogICAgd2hpbGUoIG9wICE9ICdcMCcpewogICAgICAgIGlmKHBvc3RmaXhbaV0gPT0gJ2EnKXsKICAgICAgICAgICAgcHVzaEV2YWwocG9wVmFsKCkpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBvcDIgPSBwb3BFdmFsKCk7CiAgICAgICAgICAgIG9wMSA9IHBvcEV2YWwoKTsKICAgICAgICAgICAgc3dpdGNoKG9wKXsKICAgICAgICAgICAgICAgIGNhc2UgJysnOnsgcHVzaEV2YWwob3AxK29wMik7YnJlYWs7fQogICAgICAgICAgICAgICAgY2FzZSAnLSc6e3B1c2hFdmFsKG9wMS1vcDIpO2JyZWFrO30KICAgICAgICAgICAgICAgIGNhc2UgJyonOntwdXNoRXZhbChvcDEqb3AyKTticmVhazt9CiAgICAgICAgICAgICAgICBjYXNlICcvJzp7cHVzaEV2YWwob3AxL29wMik7YnJlYWs7fQogICAgICAgICAgICAgICAgY2FzZSAnJSc6e3B1c2hFdmFsKChpbnQpb3AxJShpbnQpb3AyKTticmVhazt9CiAgICAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0UnIDoge3B1c2hFdmFsKHBvdyhvcDEsb3AyKSk7YnJlYWs7fQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wID0gcG9zdGZpeFsrK2ldOwogICAgfQoKCn0Kdm9pZCBtYWluKCl7CgogICAgZmxvYXQgdmFsOwogICAgcHJpbnRmKCJHaXZlIHRoZSBleHByZXNzaW9uXG4iKTsKICAgIHNjYW5mKCIlcyIsaW4pOwogICAgcHJlcFBhcnNlKCk7CiAgICBjb252ZXJ0KCk7CiAgICBldmFsKCk7CiAgICB2YWwgPSBwb3BFdmFsKCk7CiAgICBwcmludGYoIkFuc3dlciBpcyAlZiBcbiIsbmV4dHRvd2FyZCh2YWwsdmFsKzEpKTsKfQ==