题目:http://acm.hdu.edu.cn/showproblem.php?pid=1237
就是对栈 的应用。。但是在处理细节方面老是出错。
主要有两个错误。在判断栈顶元素和是否加入该栈的元素比较应该用一个while()循环做,而不能用if(),因为if只能判断当前的栈顶,
第二个错误就是要对循环里面的元素进行判空处理,否则会越界!!!。
下面是AC代码。有点乱:
#include<iostream>
#include<stack>
using namespace std;
char str[205];
int change(char s)
{
if(s=='+')
return 1;
else if(s=='-')
return 2;
else if(s=='*')
return 3;
return 4;
}
int cheak(int a,int b)
{
if(a==1||a==2)
a=1;
if(a==3||a==4)
a=2;
if(b==1||b==2)
b=1;
if(b==3||b==4)
b=2;
if(a>=b)
return 1;
return 0;
}
void solve()
{
double s;
int i;
stack<double>a;
stack<int>b;
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]==' ')
continue;
if(str[i]>='0'&&str[i]<='9')
{
s=0;
while(str[i]>='0'&&str[i]<='9')
{
s=s*10+str[i]-'0';
i++;
}
a.push(s);
}
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
{
int temp;
temp=change(str[i]);
if(b.empty())
{
b.push(temp);
continue;
}
else
{
int t=b.top();
while(cheak(t,temp)) //前面可能有几个比当前大的优先级
{
double a1=a.top(); a.pop();
double b1=a.top(); a.pop();
int c=b.top(); b.pop();
if(c==1)
a.push(a1+b1);
if(c==2)
a.push(b1-a1);
if(c==3)
a.push(a1*b1);
if(c==4)
a.push(b1/a1);
if(b.empty()) //如果这样写要判断为空否
break;
else
t=b.top();
}
b.push(temp);
}
}
}
while(!b.empty())
{
double a1=a.top(); a.pop();
double b1=a.top(); a.pop();
int c=b.top(); b.pop();
if(c==1)
a.push(a1+b1);
if(c==2)
a.push(b1-a1);
if(c==3)
a.push(a1*b1);
if(c==4)
a.push(b1/a1);
}
printf("%.2lf\n",a.top());
}
int main()
{
while(gets(str)!=NULL)
{
if(strcmp(str,"0")==0)
break;
solve();
}
return 0;
}
//1+2*5/10-3