hdu 1237(模拟栈、水题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237
思路:模拟栈,先处理*和/的,算出结果后在入栈,将‘+’和‘-’入s栈,最后由于考虑加减运算符的优先级,还有倒一下栈。。这样就一共用到了4个栈。。。
View Code
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<stack> 7 using namespace std; 8 9 int main(){ 10 char str[222]; 11 while(gets(str),strcmp(str,"0")){ 12 int len=strlen(str); 13 stack<double>S,SS; 14 stack<char>s,ss; 15 for(int i=0;i<len;i++){ 16 if(str[i]==' ')continue; 17 else if(str[i]=='*'||str[i]=='/'){ 18 double x=S.top(); 19 S.pop(); 20 int j; 21 double y=0; 22 for(j=i+2;j<len;j++){ 23 if(str[j]!=' '){ 24 y=y*10+str[j]-'0'; 25 }else 26 break; 27 } 28 if(str[i]=='*')S.push(x*y); 29 else S.push(x/y); 30 i=j; 31 }else if(str[i]=='+'||str[i]=='-'){ 32 s.push(str[i]); 33 }else { 34 int j; 35 double x=0; 36 for(j=i;j<len;j++){ 37 if(str[j]!=' '){ 38 x=x*10+str[j]-'0'; 39 }else 40 break; 41 } 42 S.push(x); 43 i=j; 44 } 45 } 46 while(!S.empty()){ 47 double x=S.top(); 48 SS.push(x); 49 S.pop(); 50 } 51 while(!s.empty()){ 52 char ch=s.top(); 53 ss.push(ch); 54 s.pop(); 55 } 56 while(!SS.empty()&&!ss.empty()){ 57 double x1=SS.top(); 58 SS.pop(); 59 double x2=SS.top(); 60 SS.pop(); 61 char ch=ss.top(); 62 ss.pop(); 63 if(ch=='+'){ 64 SS.push(x1+x2); 65 }else 66 SS.push(x1-x2); 67 } 68 printf("%.2lf\n",SS.top()); 69 } 70 return 0; 71 }