#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef struct
{
double date[MAXSIZE];
int top;
}Opnd;
typedef struct
{
char date[MAXSIZE];
int top;
}Opter;
char cmp[7][8]= {">><<<>>",
">><<<>>",
">>>><>>",
">>>><>>",
"<<<<<=?",
">>>>?>>",
"<<<<<?="};
void InitOpnd(Opnd &S)
{
S.top=-1;
}
void InitOpter(Opter &S)
{
S.top=-1;
}
int PushOpnd(Opnd &S,double x)
{
if(S.top==MAXSIZE-1)
{
cout<<"Stack Full\n";
exit(0);
}
S.top++;
S.date[S.top]=x;
return 1;
}
int PushOpter(Opter &S,char x)
{
if(S.top==MAXSIZE-1)
{
cout<<"Stack Full\n";
exit(0);
}
S.top++;
S.date[S.top]=x;
return 1;
}
void PopOpnd(Opnd &S)
{
S.top--;
}
void PopOpter(Opter &S)
{
S.top--;
}
double GetOpnd(Opnd &S)
{
return S.date[S.top];
}
char GetOpter(Opter &S)
{
return S.date[S.top];
}
int Change(char ch)
{
switch(ch)
{
case '+':return 0;
case '-':return 1;
case '*':return 2;
case '/':return 3;
case '(':return 4;
case ')':return 5;
case '#':return 6;
}
return 0;
}
char Compare(int m,int n)
{
return cmp[m][n];
}
double Calculate(double a,double b,char c)//计算
{
double t;
if(c=='+') t=a+b;
if(c=='-') t=a-b;
if(c=='*') t=a*b;
if(c=='/') t=a/b;
printf("process:");
cout<<a<<c<<b<<'='<<t<<endl;
return t;
}
int main()
{
Opnd N;
Opter S;
char a[100],b[100];
int l,i,k,tag=0;
double x,y,z;
char ch;
while(cin>>a)
{
InitOpnd(N);
InitOpter(S);
k=0;
l=strlen(a);
PushOpter(S,'#');
for(i=1;i<l;i++)
{
if((a[i]>='0'&&a[i]<='9')||a[i]=='.')
{
b[k]=a[i];
k++;
tag=1;
continue;
}
if(tag==1)
{
b[k]='\0';
PushOpnd(N,atof(b));
k=0;
}
ch=Compare(Change(GetOpter(S)),Change(a[i]));
tag=0;
switch(ch)
{
case '<':
PushOpter(S,a[i]);
break;
case '=':
PopOpter(S);
break;
case '>':
x=GetOpnd(N);
PopOpnd(N);
y=GetOpnd(N);
PopOpnd(N);
z=Calculate(y,x,GetOpter(S));
PushOpnd(N,z);
PopOpter(S);
i--;//这句是为了重新把反括号入栈,使之与左括号配对,否则会造成左括号多余出来
break;
}
}
double ans=GetOpnd(N);
printf("ans=%.2lf",ans);
}
return 0;
}
/*
#(7+15)*(23-28/7)#
*/
计算表达式
最新推荐文章于 2022-06-30 16:52:31 发布