Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- #define max 100
- char tab[max];
- int i=0;
- double caculate(char c ,double a,double b)
- {
- double j=0,ans=a;
- switch(c)
- {
- case '+': return a+b;
- case '-': return a-b;
- case '*': return a*b;
- case '/': return a/b;
- case '^':
- for(j=1;j<b;j++)
- ans*=a;
- return ans;
- }
- }
- int jude(char a)
- {
- if(a=='^')return 2;
- else if(a=='*'||a=='/') return 1;
- else return 0;
- }
- double caculate_op()
- {
- int top=-1,n=0,j,k;
- char stack_op[max];
- double stack_number[max],number;
- double number_double;
- double used[max]={0};
- while(1)
- {
- number=0;
- number_double=0;
- if(tab[i]>='0'&&tab[i]<='9')
- {
- do
- {
- number=number*10+tab[i]-48;
- i++;
- } while(tab[i]>='0'&&tab[i]<='9');
- if(tab[i]=='.')
- {
- i++;
- double count=1,temp;
- do
- {
- temp=tab[i]-48;
- for(j=0;j<count;j++)
- temp/=10.0;
- number_double+=temp;
- i++;
- count++;
- } while(tab[i]>='0'&&tab[i]<='9');
- }
- i--;
- number+=number_double;
- stack_number[n]=number;
- n++;
- }
- else
- switch(tab[i])
- {
- case '\0':
- case ')' :
- for(j=2;j>=0;j--)
- {
- for(k=0;k<=top;k++)
- if(jude(stack_op[k])==j)
- {
- int count=0;
- while(used[k-count]==-1){count++;}
- stack_number[k-count]=caculate(stack_op[k],stack_number[k-count],stack_number[k+1]);
- stack_number[k+1]=0;
- used[k+1]=-1;
- }
- }
- for(j=0;j<n;j++)
- number+=stack_number[j];
- return number;
- case '(' :
- i++;
- stack_number[n]=caculate_op();
- n++;
- break;
- default :
- top++;
- stack_op[top]=tab[i];
- break;
- }
- i++;
- }
- }
- int main()
- {
- scanf("%s", tab);
- printf("%lf\n",caculate_op());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement