题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35
又是赤裸裸的栈的问题,弄了三天,最终还是卡在浮点数的读取。最后还是看别人博客上面才想到去标记浮点数。。。。又是浪费一天。。。。不过这题还是很经典的,数据结构上的就是拿这题当作例题讲解的,就直接贴上代码了。
代码:
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;
//**判断算术符的优先级**//
char precede(char a,char b)
{
if(a=='+'||a=='-')
{
if(b=='+'||b=='-'||b==')'||b=='=') return '>';
else return '<';
}
if(a=='*'||a=='/')
{
if(b=='(') return '<';
else return '>';
}
if(a==')')
{
return '>';
}
if(a=='('||a=='=')
{
if(a=='('&&b==')'||a=='='&&b=='=') return '=';
else return '<';
}
}
//**算术符的运算**//
double operate(double num1,char ch,double num2)
{
double sum;
if(ch=='+')
{
sum=num1+num2;
}
if(ch=='-')
{
sum=num1-num2;
}
if(ch=='*')
{
sum=num1*num2;
}
if(ch=='/')
{
sum=num1/num2;
}
return sum;
}
int main()
{
int ncases,i,k,len,flag;
double x,y;
char c,str[1001],a[1001];
//**建立两个栈,optr储存运算符,opnd存储double字符串(数字字符)**//
stack<char>optr;
stack<double>opnd;
optr.push('=');//**将起始'='作为栈底元素**//
scanf("%d",&ncases);
while(ncases--)
{
memset(str,0,sizeof(str));
memset(a,0,sizeof(a));
flag=0;k=0;
scanf("%s",str);
len=strlen(str);
for(i=0;i<=len-1;)
{
if(str[i]=='='&&optr.top()=='=')//**如果栈顶跟读取的‘=’相同,表示表达式求值完毕**//
{
break;
}
if((str[i]>='0'&&str[i]<='9')||str[i]=='.')//**读取浮点数读取,悲剧啊**//
{
flag=1;//**flag标记是否读取完这一串数字(浮点数)**//
a[k++]=str[i];
i++;
continue;
}
if(flag==1)
{
a[k]='\0';
opnd.push(atof(a));//**atof表示将字符串转化为浮点数(double型),atoi是转化为整型(int型)
flag=0;
k=0;
}
switch(precede(optr.top(),str[i]))
{
case '<'://**栈顶元素优先权低**//
optr.push(str[i]);
i++;
break;
case '='://**脱括号**//
optr.pop();
i++;
break;
case '>': //**退栈并讲运算结果入栈**//
c=optr.top();
optr.pop();
x=opnd.top();
opnd.pop();
y=opnd.top();
opnd.pop();
opnd.push(operate(y,c,x));
break;
}
}
printf("%.2lf\n",opnd.top());
opnd.pop();
}
return 0;
}