交题应该是交过了,只不过网络赛的题没刷过去不知道什么原因
这份板子总体来说还是很漂亮的
1 #include<stack> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 using namespace std; 7 int cnt; 8 char s[105]; 9 double transla(int &p) 10 { 11 double integer=0.0; // 整数部分 12 double remainder=0.0; // 余数部分 13 while(s[p]>='0'&&s[p]<='9') 14 { 15 integer*=10; 16 integer+=(s[p]-'0'); 17 p++; 18 } 19 if(s[p]=='.') 20 { 21 p++; 22 int c=1; 23 while(s[p]>='0'&&s[p]<='9') 24 { 25 double t =s[p]-'0'; 26 t*=pow(0.1, c); 27 c++; 28 remainder+=t; 29 p++; 30 } 31 } 32 return integer+remainder; 33 } 34 int get_level(char ch) 35 { 36 switch(ch) 37 { 38 case '+': 39 case '-': 40 return 1; 41 case '*': 42 case '/': 43 return 2; 44 case '(': 45 return 0; 46 case '#': 47 return -1; 48 }; 49 return 0; 50 } 51 double opera(double a1,char op,double a2) 52 { 53 switch(op) 54 { 55 case '+': 56 return a1+a2; 57 case '-': 58 return a1-a2; 59 case '*': 60 return a1*a2; 61 case '/': 62 return a1/a2; 63 }; 64 return 0.0; 65 } 66 67 double calc() 68 { 69 stack<char> opsym; 70 stack<double> opnum; 71 opsym.push('#'); 72 int len=strlen(s); 73 bool is_minus=1; 74 for(cnt=0;cnt<len;) 75 { 76 if(s[cnt]=='-'&&is_minus) 77 { 78 opnum.push(0); 79 opsym.push('-'); 80 cnt++; 81 } 82 else if(s[cnt]==')') 83 { 84 is_minus=0; 85 cnt++; 86 while(opsym.top()!='(') 87 { 88 double a2=opnum.top(); 89 opnum.pop(); 90 double a1=opnum.top(); 91 opnum.pop(); 92 char op=opsym.top(); 93 opsym.pop(); 94 double res=opera(a1,op,a2); 95 opnum.push(res); 96 } 97 opsym.pop(); 98 } 99 else if(s[cnt]>='0'&&s[cnt]<='9') 100 { 101 is_minus=0; 102 opnum.push(transla(cnt)); 103 } 104 else if(s[cnt]=='(') 105 { 106 is_minus=1; 107 opsym.push(s[cnt]); 108 cnt++; 109 } 110 else 111 { 112 while(get_level(s[cnt])<=get_level(opsym.top())) 113 { 114 double a2=opnum.top(); 115 opnum.pop(); 116 double a1=opnum.top(); 117 opnum.pop(); 118 char op=opsym.top(); 119 opsym.pop(); 120 double res=opera(a1,op,a2); 121 opnum.push(res); 122 } 123 opsym.push(s[cnt]); 124 cnt++; 125 } 126 } 127 while(opsym.top()!='#') 128 { 129 double a2=opnum.top(); 130 opnum.pop(); 131 double a1=opnum.top(); 132 opnum.pop(); 133 char op=opsym.top(); 134 opsym.pop(); 135 double res=opera(a1,op,a2); 136 opnum.push(res); 137 } 138 return opnum.top(); 139 } 140 int main() 141 { 142 cin>>s; 143 printf("%.3lf",calc()); 144 return 0; 145 }