难点在于判断输入的数字是否为负数和运算符优先级。
可以在一次循环中以获取一个数字+ 一个运算符+括号(如果有)为准则 ,如果在这次循环中先遇到‘-’号,则将它与后面的数视为负数而不是将‘-’视为减号。
在遇到运算符入栈时,要判断符号优先级,只要不高于栈顶符号优先级就先把栈顶符号取出计算,直到满足条件才入栈。
#include <stdio.h>
#include <string.h>
int main(){
char str[1000];
while(scanf("%s",str)!=EOF){
float s1[500]={0};//数字栈
char s2[500]={0};//运算符栈
int top1=-1,top2=-1,i=0,len=strlen(str);
while(i<=len || top1!=-1){//每次循环以一个数字与一个运算符的组合为步长(忽略括号)
int flag=0;//判断是否是负数
float num=0;
if(str[i]==')' || str[i]==']'|| str[i]=='}' || i>=len){//弹出两个数与一个运算符计算,将结果推进数字栈中
while(s2[top2]!='('){
if(s2[top2]=='*'){
s1[top1-1]*=s1[top1];
}
else if(s2[top2]=='/'){
s1[top1-1]/=s1[top1];
}
else if(s2[top2]=='+'){
s1[top1-1]+=s1[top1];
}
else if(s2[top2]=='-'){
s1[top1-1]-=s1[top1];
}
top1--;top2--;
if(top2<0){
break;
}
}
top2--;i++;
if(str[i]=='+' || str[i]=='-'){//判断符号优先级,优先级不高于栈顶符号时,取出栈顶符号运算
while(s2[top2]!='(' && top2!=-1){
if(s2[top2]=='+'){
s1[top1-1]+=s1[top1];
top1--;
}
else if(s2[top2]=='-'){
s1[top1-1]-=s1[top1];
top1--;
}
else if(s2[top2]=='*'){
s1[top1-1]*=s1[top1];
top1--;
}
else if(s2[top2]=='/'){
s1[top1-1]/=s1[top1];
top1--;
}
else{
break;
}
top2--;
}
s2[++top2]=str[i++];
}
if(str[i]=='*' || str[i]=='/'){//判断符号优先级,优先级不高于栈顶符号时,取出栈顶符号运算
while(s2[top2]!='(' && top2!=-1){
if(s2[top2]=='*'){
s1[top1-1]*=s1[top1];
top1--;
}
else if(s2[top2]=='/'){
s1[top1-1]/=s1[top1];
top1--;
}
else{
break;
}
top2--;
}
s2[++top2]=str[i++];
}
}
else{
if(str[i]=='-'){
flag=1;
i++;
}
while(str[i]>='0' && str[i]<='9'){//数字入栈
num=num*10+str[i]-'0';
if(str[i+1]>='0' && str[i+1]<='9'){
i++;
continue;
}
else{
if(flag){
s1[++top1]=-num;
}
else{
s1[++top1]=num;
}
i++;
break;
}
}
if(str[i]=='+' || str[i]=='-'){//判断符号优先级,优先级不高于栈顶符号时,取出栈顶符号运算
while(s2[top2]!='(' && top2!=-1){
if(s2[top2]=='+'){
s1[top1-1]+=s1[top1];
top1--;
}
else if(s2[top2]=='-'){
s1[top1-1]-=s1[top1];
top1--;
}
else if(s2[top2]=='*'){
s1[top1-1]*=s1[top1];
top1--;
}
else if(s2[top2]=='/'){
s1[top1-1]/=s1[top1];
top1--;
}
else{
break;
}
top2--;
}
s2[++top2]=str[i++];
}
if(str[i]=='*' || str[i]=='/'){//判断符号优先级,优先级不高于栈顶符号时,取出栈顶符号运算
while(s2[top2]!='(' && top2!=-1){
if(s2[top2]=='*'){
s1[top1-1]*=s1[top1];
top1--;
}
else if(s2[top2]=='/'){
s1[top1-1]/=s1[top1];
top1--;
}
else{
break;
}
top2--;
}
s2[++top2]=str[i++];
}
if(str[i]=='(' || str[i]=='['|| str[i]=='{'){
s2[++top2]='(';
i++;
}
}
}
printf("%.f",s1[0]);//输出栈顶的结果
}
}

京公网安备 11010502036488号