#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
//分别创建储存数字和操作数的栈
typedef struct
{
double data[1000];
int top;
}stackopnd;
typedef struct
{
char str[100];
int top;
}stackoptr;
char prior[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','E',
'>','>','>','>','E','>','>',
'<','<','<','<','<','E','='};
void initopnd(stackopnd &s)
{
s.top=-1;
}
void initoptr(stackoptr &s)
{
s.top=-1;
}
void pushopnd(stackopnd &s,double e)
{
s.top++;
s.data[s.top]=e;
}
void pushoptr(stackoptr &s,char e)
{
s.top++;
s.str[s.top]=e;
}
double gettopopnd(stackopnd s)
{
double e;
e=s.data[s.top];
return e;
}
char gettopoptr(stackoptr s)
{
char e;
e=s.str[s.top];
return e;
}
void popopnd(stackopnd &s,double &e)
{
e=s.data[s.top];
s.top--;
}
void popoptr(stackoptr &s,char &e)
{
e=s.str[s.top];
s.top--;
}
double operate(double a,char theta,double b)
{
char op[4]={'+','-','*','/'};
int i;
for(i=0;i<4;i++)
{
if(theta==op[i])
break;
}
switch(i)
{
case 0:return a+b;
case 1:return a-b;
case 2:return a*b;
case 3:return a/b;
}
}
//判断字符c是否是操作符
bool In(char c)
{
char op[8]={'+','-','*','/','(',')','#'};
int i,f=0;
for(i=0;i<7;i++)
{
if(c==op[i])
{
f=1;
break;
}
}
if(f==0)
return false;
else
return true;
}
//判断两个操作符的优先级
char precede(char a,char b)
{
char op[8]={'+','-','*','/','(',')','#'};
int i,j;
for(i=0;i<8;i++)
{
if(a==op[i])
break;
}
for(j=0;j<8;j++)
{
if(b==op[j])
break;
}
return prior[i][j];
}
double caculate()
{
stackoptr optr;
stackopnd opnd;
double a,b,c1;
char theta,c,x;
initoptr(optr);pushoptr(optr,'#'); //初始化栈,并把'#'压入栈底
initopnd(opnd);c=getchar();
while(c!='#'||gettopoptr(optr)!='#')
{
if(!In(c)) //c是数字,就存入opnd 中
{
c1=c-'0';
pushopnd(opnd,c1);
c=getchar();
}
else
switch(precede(gettopoptr(optr),c))
{
case '<':
pushoptr(optr,c);c=getchar();
break;
case '=':
popoptr(optr,x);c=getchar();
break;
case '>':
popoptr(optr,theta);
popopnd(opnd,b);popopnd(opnd,a);
pushopnd(opnd,operate(a,theta,b));
break;
}
}
return gettopopnd(opnd);
}
int main()
{
while(1)
{
cout<<caculate()<<endl;
system("PAUSE");
system("CLS");
}
return 0;
}
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
//分别创建储存数字和操作数的栈
typedef struct
{
double data[1000];
int top;
}stackopnd;
typedef struct
{
char str[100];
int top;
}stackoptr;
char prior[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','E',
'>','>','>','>','E','>','>',
'<','<','<','<','<','E','='};
void initopnd(stackopnd &s)
{
s.top=-1;
}
void initoptr(stackoptr &s)
{
s.top=-1;
}
void pushopnd(stackopnd &s,double e)
{
s.top++;
s.data[s.top]=e;
}
void pushoptr(stackoptr &s,char e)
{
s.top++;
s.str[s.top]=e;
}
double gettopopnd(stackopnd s)
{
double e;
e=s.data[s.top];
return e;
}
char gettopoptr(stackoptr s)
{
char e;
e=s.str[s.top];
return e;
}
void popopnd(stackopnd &s,double &e)
{
e=s.data[s.top];
s.top--;
}
void popoptr(stackoptr &s,char &e)
{
e=s.str[s.top];
s.top--;
}
double operate(double a,char theta,double b)
{
char op[4]={'+','-','*','/'};
int i;
for(i=0;i<4;i++)
{
if(theta==op[i])
break;
}
switch(i)
{
case 0:return a+b;
case 1:return a-b;
case 2:return a*b;
case 3:return a/b;
}
}
//判断字符c是否是操作符
bool In(char c)
{
char op[8]={'+','-','*','/','(',')','#'};
int i,f=0;
for(i=0;i<7;i++)
{
if(c==op[i])
{
f=1;
break;
}
}
if(f==0)
return false;
else
return true;
}
//判断两个操作符的优先级
char precede(char a,char b)
{
char op[8]={'+','-','*','/','(',')','#'};
int i,j;
for(i=0;i<8;i++)
{
if(a==op[i])
break;
}
for(j=0;j<8;j++)
{
if(b==op[j])
break;
}
return prior[i][j];
}
double caculate()
{
stackoptr optr;
stackopnd opnd;
double a,b,c1;
char theta,c,x;
initoptr(optr);pushoptr(optr,'#'); //初始化栈,并把'#'压入栈底
initopnd(opnd);c=getchar();
while(c!='#'||gettopoptr(optr)!='#')
{
if(!In(c)) //c是数字,就存入opnd 中
{
c1=c-'0';
pushopnd(opnd,c1);
c=getchar();
}
else
switch(precede(gettopoptr(optr),c))
{
case '<':
pushoptr(optr,c);c=getchar();
break;
case '=':
popoptr(optr,x);c=getchar();
break;
case '>':
popoptr(optr,theta);
popopnd(opnd,b);popopnd(opnd,a);
pushopnd(opnd,operate(a,theta,b));
break;
}
}
return gettopopnd(opnd);
}
int main()
{
while(1)
{
cout<<caculate()<<endl;
system("PAUSE");
system("CLS");
}
return 0;
}