#include<iostream>
using namespace std;
#define Stack_Init_Size 100 //存储空间初始化分配量
#define Stack_Increment 10 //存储空间分配增量
#define error 0
typedef struct
{
float *base;
float *top; //栈里的所有数据都是以float型存储的
int stacksize; //当前已分配的存储空间大小
}SqStack;
void InitStack(SqStack &S) //构造一个空栈
{
S.base=(float *)malloc(Stack_Init_Size*sizeof(float));
if(!S.base)
cout<<"分配失败"<<endl; //分配失败
S.top=S.base;
S.stacksize=Stack_Init_Size;
}
float GetTop(SqStack S) //若栈非空,返回运算符栈栈顶元素
{
if(S.top==S.base) return error;
return *(S.top-1);
}
void AddSpace(SqStack &S) //增加空间
{
S.base=(float*)realloc(S.base,(S.stacksize+Stack_Increment)*sizeof(float));
if(!S.base) cout<<"分配空间失败"<<endl;
S.top=S.base+S.stacksize; //top指针退回到正确位置
S.stacksize+=Stack_Increment;
}
void Push(SqStack &S,float e) //插入运算符
{
if(S.top-S.base>=S.stacksize)//栈满则追加存储空间
AddSpace(S);
*S.top++=e; //将运算数压入栈顶
}
void Pop(SqStack &S,float &e) //运算符出栈,用e返回栈顶元素的值
{
if(S.top==S.base)
cout<<"error:运算数栈为空栈"<<endl;
e=*--S.top;
}
int In(float c) //判断c是否是运算符,如果是则返回1,不是则返回0
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')
return 1;
else return 0;
}
char Precede(float e,char b) //运算符优先级的比较函数,e,a代表栈顶运算符,b代表将要压栈的运算符
{
char a=(char)e;
char result;
switch(a)
{
case '+':
if(b=='*'||b=='/'||b=='(')
result='<';
else result='>';
break;
case '-':
if(b=='*'||b=='/'||b=='(')
result='<';
else result='>';
break;
case '*':
if(b=='(')
result='<';
else result='>';
break;
case '/':
if(b=='(')
result='<';
else result='>';
break;
case '(':
if(b==')')
result='=';
else if(b=='=')
cout<<"输入错误"<<endl;
else result='<';
break;
case ')':
if(b=='(')
cout<<"输入错误"<<endl;
else result='>';
break;
case '=':
if(b==')')cout<<"输入错误"<<endl;
else if(b=='=') result='=';
else result='<';
break;
}
return result;
}
float Operate(float a,float e,float b) //二元运算a c b,并返回结果
{
char c=(char)e;
float result;
switch(c)
{
case '+':
result=a+b;
break;
case '-':
result=a-b;
break;
case '*':
result=a*b;
break;
case '/':
result=a/b;
break;
}
return result;
}
float EvaluateExpression() //主要算法,OPTR为运算符栈,OPND为运算数栈
{
SqStack OPTR,OPND;
InitStack(OPTR); Push(OPTR,'=');
InitStack(OPND);
char c=getchar();
float J=1,e,y,x,m;
float a,b,theta;//a,b为需要运算的运算数,theta为运算符
int q=0;
while(c!='='||GetTop(OPTR)!='=')
{
if(!In(c))
{
if(c!='.') //如果下一个字符C不是小数点,则将c压入运算数栈
{
x=(int)(c-'0'); //转换格式将字符型c转换为int型,存放在x中
if(J==1)
{
Push(OPND,x);
}
else
if(J>1)
{
Pop(OPND,e);
e=e*J+x;
J*=10;
Push(OPND,e);
}
else
{
Pop(OPND,e);
e+=x*J;
J=J*0.1;
Push(OPND,e);
}
}
else
J=0.1;
c=getchar();
}
else
{
if(q)
{
Pop(OPND,e);
e=0-e;
Push(OPND,e);
}
J=1;
float m=c;
switch(Precede(GetTop(OPTR),m))
{
case '<': //栈顶元素的优先级低
Push(OPTR,m); //将新的运算符压入栈顶
c=getchar();
break;
case '=': //此时为一对括号,脱去括号,并接收下一个字符
Pop(OPTR,x);
c=getchar();
break;
case '>': //退栈,并将运算结果入栈
Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
if(m=='('&&c=='-')
{
q=1;
c=getchar();
}
else
q=0;
}
}
return GetTop(OPND);
}
int main()
{
cout<<"请输入算术表达式:"<<endl;
float result=EvaluateExpression();
cout<<"结果为:"<<result<<endl;
return 0;
}