几组测试用例
2 / 2 / 2
2 - 2 - 2
1 * 2 + 1 + 1 * 2 * 3 / 3 - 1 + 2 / 1 = 6.00
1 / 7 / 3 * 7 * 3 = 1.00
37 - 97 * 90 + 17 * 70 + 50 + 93 - 63 / 29 * 31 * 61 * 61 - 92 + 44 + 98 - 5 - 28 * 38 + 63 - 13 / 31 / 26 / 5 - 29 + 55 / 40 / 26 = -258935.05
减法和除法没有交换律
#include <iostream>
#include <stack>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int getline_(char s[],int lim){
int c,i;
i=0;
while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
s[i++]=c;
s[i]='\0';
return i;
}
int getline2_(char s[],int lim){
int c,i;
i=0;
while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
s[i++]=c;
if(c==EOF&&i==0)
return -1;
s[i]='\0';
return i;
}
int getline3_(char s[],int lim){
int c,i;
i=0;
while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
s[i++]=c;
if(c==EOF&&i==0)
return -1;
if(i==1&&s[0]=='0')
{
return -1;
}
s[i]='\0';
//cout<<"i= "<<i<<endl;
return i;
}
int calcluate(char *s,int len)
{
double s11[200];
char s22[200];
int top1=0;
int top2=0;
double num =0;
int a;
char c;
int count =0;
int pos=0;
char tmp[100];
double number1,number2;
for(int i=0;i<len;i++)
{
memset(tmp,0,100);
if(s[i] == ' ')
{
count++;
if(count%2 == 1)
{
//cout<<"count = "<<count<<endl;;
memcpy(tmp,&s[pos],i-pos);
tmp[i-pos]='\0';
//cout<<"tmp = "<<tmp<<endl;
a = atoi(tmp);
//cout<<"a = "<<a<<endl;
s11[top1++]=a;
pos = i+1;
}
else
{
c = s[i-1];
if((c == '+'||c == '-') && (s22[top2-1]=='*'||s22[top2-1]=='/'))//1 + 2 * 3 - 4
{
while(top2>0)
{
number1 = s11[top1-2];
number2 = s11[top1-1];
if(s22[top2-1]=='+') num = number1 + number2;
if(s22[top2-1]=='-') num = number1 - number2;
if(s22[top2-1]=='*') num = number1 * number2;
if(s22[top2-1]=='/') num = number1 / number2;
//cout<<"->"<<s22[top2-1]<<endl;
//cout<<"->num = "<<num<<" number1 = "<<number1<<" number2 = "<<number2<<endl;
s11[top1-2] = num;
top1--;
top2--;
}
}
if((c=='-'||c=='+') && s22[top2-1]=='-')//栈顶为减号 清栈
{
number1 = s11[top1-2];
number2 = s11[top1-1];
num = number1 - number2;
s11[top1-2] = num;
top1--;
top2--;
}
if((c=='/'||c=='*') && s22[top2-1]=='/')//栈顶为减号 清栈
{
number1 = s11[top1-2];
number2 = s11[top1-1];
num = number1 / number2;
s11[top1-2] = num;
top1--;
top2--;
}
pos = i+1;
s22[top2++]=c;
}
}
if(i == len-1)
{
memcpy(tmp,&s[pos],i-pos+1);
tmp[i-pos+1]='\0';
a = atoi(tmp);
s11[top1++]=a;
}
}
/*cout<<"look stack1 data top1= "<<top1<<endl;
for(int j=0;j<top1;j++)
cout<<s11[j]<<" ";
cout<<"\nlook stack2 data top2= "<<top2<<endl;
for(int j=0;j<top2;j++)
cout<<s22[j]<<" ";
cout<<endl;
cout<<"计算结果\n";*/
while(top2>0)
{
number1 = s11[top1-2];
number2 = s11[top1-1];
//cout<<"-<"<<s22[top2-1]<<endl;
if(s22[top2-1]=='+') num = number1 + number2;
if(s22[top2-1]=='-') num = number1 - number2;
if(s22[top2-1]=='*') num = number1 * number2;
if(s22[top2-1]=='/') num = number1 / number2;
//cout<<"-<num = "<<num<<" number1 = "<<number1<<" number2 = "<<number2<<endl;
s11[top1-2] = num;
top1--;
top2--;
}
printf("%0.2f\n",s11[top1-1]);
}
int main()
{
char *seq = (char*)malloc(200);
while(getline3_(seq,200)!= -1)
{
calcluate(seq,strlen(seq));
}
return 0;
}