fork download
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <climits>
  5. struct posi_loca{
  6. int left,right,priority;
  7. posi_loca *leftptr,*rightptr;
  8. };
  9. class express{
  10. private:
  11. char *origstr,*strconver;
  12. posi_loca *discrete,*expre_tree;
  13. int discr_length;
  14. public:
  15. express();
  16. posi_loca low_priority(int left,int right);
  17. void maketree(posi_loca **treeptr,int left,int right);
  18. double operato(double num1,char op,double num2);
  19. double calculation(posi_loca* treeptr);
  20. void killtree(posi_loca *treeptr);
  21. ~express();
  22. };
  23. double express::operato(double num1,char op,double num2){
  24. switch(op){
  25. case '+':return num1+num2;
  26. case '-':return num1-num2;
  27. case '*':return num1*num2;
  28. case '/':return num1/num2;
  29. }
  30. return 0;
  31. }
  32. posi_loca express::low_priority(int left,int right){
  33. int min=INT_MAX;
  34. posi_loca distemp_op,distemp_num;
  35. distemp_op.priority=0;
  36. for(int i=1;discrete[i].right<=right;i++){
  37. if(discrete[i].left>=left){
  38. if(discrete[i].priority&&min>=discrete[i].priority){
  39. min=discrete[i].priority;
  40. distemp_op=discrete[i];
  41. }
  42. else if(!discrete[i].priority)
  43. distemp_num=discrete[i];
  44. }
  45. }
  46. if(distemp_op.priority)
  47. return distemp_op;
  48. else
  49. return distemp_num;
  50. }
  51. void express::maketree(posi_loca **treeptr,int left,int right){
  52. *treeptr=(posi_loca*)malloc(sizeof(posi_loca));
  53. posi_loca lower_priority=low_priority(left,right);
  54. **treeptr=lower_priority;
  55. if(lower_priority.priority){
  56. maketree(&((*treeptr)->leftptr),left,lower_priority.left-1);
  57. maketree(&((*treeptr)->rightptr),lower_priority.left+1,right);
  58. }
  59. else{
  60. (*treeptr)->leftptr=NULL;(*treeptr)->rightptr=NULL;
  61. (*treeptr)->priority=0;
  62. }
  63. }
  64. double express::calculation(posi_loca* treeptr){
  65. if(treeptr->priority){
  66. return operato(calculation(treeptr->leftptr),origstr[treeptr->left],calculation(treeptr->rightptr));
  67. }
  68. int j=0;
  69. for(int i=treeptr->left;i<=treeptr->right;i++)
  70. strconver[j++]=origstr[i];
  71. strconver[j]='\0';
  72. return atof(strconver);
  73. }
  74. express::express(){
  75. origstr=(char*)malloc(1010);
  76. strconver=(char*)malloc(1010);
  77. discrete=(posi_loca*)malloc(sizeof(posi_loca)*1010);
  78. int pare_num=0;
  79. scanf("%s",origstr+1);
  80. discr_length=0;
  81. for(int i=1,j=1;j<(int)strlen(origstr+1);){
  82. switch(origstr[j]){
  83. case '+':
  84. case '-':
  85. discrete[++discr_length].left=i;
  86. discrete[discr_length].right=j;
  87. discrete[discr_length].priority=1+2*pare_num;
  88. i++;j++;break;
  89. case '*':
  90. case '/':
  91. discrete[++discr_length].left=i;
  92. discrete[discr_length].right=j;
  93. discrete[discr_length].priority=2+2*pare_num;
  94. i++;j++;break;
  95. case '(':
  96. pare_num++;i++;j++;break;
  97. case ')':
  98. pare_num--;i++;j++;break;
  99. default:
  100. while((origstr[j]>='0'&&origstr[j]<='9')||origstr[j]=='.')
  101. j++;
  102. discrete[++discr_length].left=i;
  103. discrete[discr_length].right=j-1;
  104. discrete[discr_length].priority=0;
  105. i=j;
  106. }
  107. }
  108. maketree(&expre_tree,1,strlen(origstr+1)-1);
  109. printf("%.2f\n",calculation(expre_tree));
  110. }
  111. void express::killtree(posi_loca *treeptr){
  112. if(treeptr->leftptr==NULL){
  113. free(treeptr);
  114. return ;}
  115. killtree(treeptr->leftptr);
  116. killtree(treeptr->rightptr);
  117. free(treeptr);
  118. }
  119. express::~express(){
  120. free(origstr);
  121. free(strconver);
  122. free(discrete);
  123. killtree(expre_tree);
  124. }
  125. int main(){
  126. int n;
  127. scanf("%d",&n);
  128. while(n--){
  129. express *p1=new express;
  130. delete p1;
  131. }
  132. return 0;
  133. }
  134.  
Runtime error #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
Standard output is empty