题目链接:
HNUCM-OJ 1232 算法3-4 表达式求值
解题思路:
这一个题,关键是怎么表现两个运算符的优先级,在网上看到一个大佬的总结,用一个二维数组来表现,运算符之间的优先级,其中θ1为存放运算符的栈(我自己定义的为s2)的栈顶元素,θ2为从表达式中读取的操作符
#include
#include
#include
#include
using namespace std;
const int cmax=10e5+5;
char s[cmax];
stack<double> s1;
stack<char> s2;
const char priority[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='},
};
int getIndex(char c)
{
int index;
switch(c)
{
case'+':
index=0;
break;
case'-':
index=1;
break;
case'*':
index=2;
break;
case'/':
index=3;
break;
case'(':
index=4;
break;
case')':
index=5;
break;
default:
index=6;
break;
}
return index;
}
char getPriority(char a,char b)
{
int index1,index2;
index1=getIndex(a);
index2=getIndex(b);
return priority[index1][index2];
}
double calculate(double num1,char c,double num2)
{
double sum;
switch(c)
{
case'+':
sum=num2+num1;
break;
case'-':
sum=num2-num1;
break;
case'*':
sum=num2*num1;
break;
case'/':
sum=num2/num1;
break;
}
return sum;
}
double getAnswer(char s[])
{
s2.push('#');
int counter=0;
int len=strlen(s);
int i=0;
while(i<len)
{
if(s[i]-'0'>=0&&s[i]-'0'<=9)
{
if(counter==1)
{
double num1=s1.top();
s1.pop();
num1=num1*10+(s[i]-'0');
s1.push(num1);
i++;
}
else
{
s1.push(s[i]-'0');
i++;
counter++;
}
}
else
{
counter=0;
char c=getPriority(s2.top(),s[i]);
switch(c)
{
case'<':
s2.push(s[i]);
i++;
break;
case'>':
{
char c1=s2.top();
s2.pop();
double num2=s1.top();
s1.pop();
double num3=s1.top();
s1.pop();
double num4=calculate(num2,c1,num3);
s1.push(num4);
break;
}
case'=':
s2.pop();
i++;
break;
}
}
}
return s1.top();
}
int main()
{
while(~scanf("%s",s))
{
while(!s1.empty())
s1.pop();
while(!s2.empty())
s2.pop();
double num=getAnswer(s);
cout<<num<<endl;
}
return 0;
}