编写程序,读入一行恰好包括一个加号、减号、乘号或除号的表达式,输出它的值。这个运算符保证是二元运算符,且两个运算数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格、TAB隔开。行首末尾均可以有空格。提示:选择适合的输入方法可以将问题简化。
样例输入:1+1
2- 5
0 *1982
样例输出: 2
-3
0
<span style="font-family:Arial;font-size:14px;">#include<stdio.h>
#define MAX 100
char mark[6]={'=','+','-','*','/','\n'};
int llevel[6]={-1,1,1,2,2,0};//记录相对应的运算符的左优先级
int rlevel[6]={-1,2,2,3,3,0};//记录相对应的运算符的右优先级
int main(){
char c;
int t=0;
int num[MAX];//存储数字
char st[MAX];// 存储运算符
st[0]='=';
int n=-1;
int sn=0;
while((c=getchar())!=EOF){
if(c>='0'&&c<='9'){
t=t*10+(c-'0');
}
else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='\n'){
num[++n]=t;
t=0;
int i;
int left;
int right;
for(i=0;i<6;i++){//分别寻找左优先级和右优先级
if(c==mark[i]){
right=i;
}
if(st[sn]==mark[i])
left=i;
}
/**1.当右优先级高于左优先级时进栈,低于时出栈顶元素操作符,直到右优先级高于左优先级*/
/**2.判定栈顶的运算符是否为'=’且右运算符是否为'\n',是则输出num最低层的元素,否则继续读取字符*/
if(llevel[left]<rlevel[right])
st[++sn]=c;
else{
while(1){
if(st[sn]=='-'){
sn--;
num[n-1]=num[n-1]-num[n];
n=n-1;
}
else if(st[sn]=='+'){
sn--;
num[n-1]=num[n-1]+num[n];
n=n-1;
}
else if(st[sn]=='*'){
sn--;
num[n-1]=num[n-1]*num[n];
n=n-1;
}
else if(st[sn]=='/'){
sn--;
num[n-1]=num[n-1]/num[n];
n=n-1;
}
for(i=0;i<6;i++){
if(st[sn]==mark[i])
left=i;
}
if(rlevel[right]>llevel[left]){
break;
}
}
if(st[sn]=='='&&c=='\n')
printf("%d\n",num[n--]);
}
}
}
return 0;
}
</span>