表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
思路:数据结构实验课实现过,开两个栈一个是符号栈一个是数栈,然后依次读取输入的字符串如果是数字就转化成数并入栈,如果是运算符就比较运算符优先级进行计算,这里我们将运算符打表,然后在字符串的头和尾都增加一个#来判断边缘情况。
栈底的字符#,是用来判断第一个运算符的时候,如果不加#这是从运算符栈取出的为空,无法计算。
栈顶的字符#,是因为我们输入的字符串中的运算符经过大小比较的运算最终会剩下一个,如果没有这个末尾的#那么运算没有结束,数栈中也会剩余数,运算符栈也会剩下一个,我们增加这个#由于他的优先级最低,会将最后一个运算符计算出
PS:这里测试数据中不会再末尾输入#结束,所以我们可以通过开一个字符数组值存储# 然后通过strcat将其连在输入的字符串末尾就实现了#结束;
#include
#include
#include
#include
using namespace std;
char s[110];
char pre[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','0'},
{'>','>','>','>','0','>','>'},
{'<','<','<','<','<','0','='}};
char procede(char a,char b)
{
int i,j;
switch(a)
{
case'+':i=0;break;
case'-':i=1;break;
case'*':i=2;break;
case'/':i=3;break;
case'(':i=4;break;
case')':i=5;break;
case'#':i=6;break;
}
switch(b)
{
case'+':j=0;break;
case'-':j=1;break;
case'*':j=2;break;
case'/':j=3;break;
case'(':j=4;break;
case')':j=5;break;
case'#':j=6;break;
}
return pre[i][j];
}
int operate(int m,int n,char x)
{
if(x=='+')
return m+n;
if(x=='-')
return n-m;
if(x=='*')
return m*n;
if(x=='/')
return n/m;
}
int main()
{
int k,y;
stackshu;
char c;
char ss[2]="#";
stackfu;
fu.push('#');
gets(s);
strcat(s,ss);
c=s[0];
k=1;
while(c!='#'||fu.top()!='#')
{
y=0;
if(c>='0'&&c<='9')
{
while(c>='0'&&c<='9')
{
y=y*10+(c-'0');
c=s[k++];
}
shu.push(y);
}
else
{
switch(procede(fu.top(),c))
{
case'<':
fu.push(c);
c=s[k++];
break;
case'=':
fu.pop();
c=s[k++];
break;
case'>':
char x=fu.top();fu.pop();
int m=shu.top();shu.pop();
int n=shu.top();shu.pop();
shu.push(operate(m,n,x));
break;
}
}
}
printf("%d",shu.top());
return 0;
}