悲剧了好几次,应该先判断栈是否为空,才能取栈顶元素,应该记住啊!
1 #include <iostream> 2 #include <stack> 3 #include<string> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<algorithm> 7 using namespace std; 8 stack<double> num; 9 stack<char> sc; 10 double exp(double n1, double n2, char ch) 11 { 12 switch(ch){ 13 case '+':return n1+n2; 14 case '-':return n2-n1; 15 case '*':return n1*n2; 16 case '/':return n2/n1; 17 default: break; 18 } 19 } 20 21 bool isnum(char c) 22 { 23 if((c >= '0' && c <= '9') || c == '.') 24 return true; 25 return false; 26 } 27 28 bool pre(char c1, char c2) 29 { 30 if(c1 == ')' || c1 == '=') 31 return false; 32 else if(c2 == '(') 33 return true; 34 else if(c1 == '+' || c1 == '-') 35 return false; 36 else if((c1 == '*' || c1 == '/') && (c2 == '*' || c2 == '/')) 37 return false; 38 return true; 39 } 40 41 void out() 42 { 43 double n1,n2; 44 n1 = num.top(); num.pop(); 45 n2 = num.top(); num.pop(); 46 cout<<sc.top(); 47 num.push(exp(n1,n2,sc.top())); 48 sc.pop(); 49 } 50 void slove(string s) 51 { 52 int i,j; char a[19]; 53 while(!sc.empty()) sc.pop(); 54 while(!num.empty()) num.pop(); 55 for(i=0; i<s.length(); ++i) 56 { 57 if(isnum(s[i])) 58 { 59 j = 0; 60 while(isnum(s[i])) a[j++] = s[i++]; 61 a[j] = '\0'; cout<<a; 62 num.push(atof(a)); --i; 63 } 64 else 65 { 66 if(sc.empty() || pre(s[i],sc.top())) sc.push(s[i]); 67 else{ 68 if(s[i] == ')') 69 { 70 while(sc.top() != '(') out(); 71 sc.pop(); 72 } 73 else if(s[i] == '=') 74 { 75 while(!sc.empty()) out(); 76 } 77 else 78 { 79 while(!sc.empty() && !pre(s[i],sc.top()) ) out(); 80 sc.push(s[i]); 81 } 82 } 83 } 84 } 85 cout<<'='<<endl; 86 printf("%.2f\n",num.top()); 87 num.pop(); 88 } 89 90 int main() 91 { 92 int t; 93 cin>>t; 94 while(t--) 95 { 96 string s; 97 cin>>s; 98 slove(s); 99 if(t>=1) 100 cout<<endl; 101 } 102 return 0; 103 }