#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
typedef struct {
char *base;
char *top;
int stacksize;
}SqStackchar;
typedef struct {
float *base;
float *top;
int stacksize;
}SqStackint;
//构造空栈
SqStackchar InitStackchar(){
SqStackchar S;
S.base=(char *)malloc(sizeof(char));
if(S.base==NULL) exit(-1);
S.top=S.base;
S.stacksize=100;
return S;
}
SqStackint InitStackint(){
SqStackint S;
S.base=(float *)malloc(sizeof(float));
if(S.base==NULL) exit(-1);
S.top=S.base;
S.stacksize=100;
return S;
}
//进栈
SqStackchar Pushchar(SqStackchar &S,char c){
if((S.top-S.base)==S.stacksize){
S.base=(char *)realloc(S.base,110*sizeof(char));
if(S.base==NULL) exit(-1);
S.top=S.base+S.stacksize;
}
*S.top++=c;
return S;
}
SqStackint Pushint(SqStackint &S,float c){
if((S.top-S.base)==S.stacksize){
S.base=(float *)realloc(S.base,110*sizeof(float));
if(S.base==NULL) exit(-1);
S.top=S.base+S.stacksize;
}
*S.top++=c;
return S;
}
//获得栈顶元素
char GetTopchar(SqStackchar S){
char e;
if(S.top==S.base) exit(-1);
e=*(S.top-1);
return e;
}
float GetTopint(SqStackint S){
float e;
if(S.top==S.base) exit(-1);
e=*(S.top-1);
return e;
}
//出栈操作
char Popchar(SqStackchar &S){
if(S.top==S.base) exit(-1);
char e;
e=*--S.top;
return e;
}
float Popint(SqStackint &S){
if(S.top==S.base) exit(-1);
float e;
e=*--S.top;
return e;
}
//判断该字符是数字的还是操作符
int In(char c){
if(c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9') return 1;
else return 0;
}
//运算函数
float Operate(float a,char theta,float b){
switch(theta){
case '+':return (a+b);
case '-':return (a-b);
case '*':return (a*b);
case '/':return (a/b);
default:exit(-1);
}
}
//判断操作符的优先级 //严格按照书上的表得到
char Precede(char a,char b){
if((a=='('&&b!=')')||(a=='#'&&b!='#')) return '<';
if(a==')') return '>';
if((a=='('&&b==')')||(a=='#'&&b=='#')) return '=';
if((a=='+'||a=='-')&&(b=='+'||b=='-'||b==')'||b=='#')) return '>';
if((a=='+'||a=='-')&&(b=='*'||b=='/'||b=='(')) return '<';
if((a=='*'||a=='/')&&(b=='(')) return '<';
if((a=='*'||a=='/')&&(b=='+'||b=='-'||b=='*'||b=='/'||b==')'||b=='#')) return '>';
}
//主函数
int main()
{
SqStackchar OPRT;//存储运算符
SqStackint OPND;//存储运算数
OPRT=InitStackchar();
Pushchar(OPRT,'#');//#先进栈作为表达式的开始符
OPND=InitStackint();
char c;
printf("请输入表达式:\n");
c=getchar();
float a,b;
char theta;
while(c!='#'||GetTopchar(OPRT)!='#'){//GetTopchar(OPRT)!='#'判断是否建栈成功
if(In(c)){
//c为数字
Pushint(OPND,c-48);//c-48表示ASCII-48得到具体数据值
c=getchar();
while(In(c)){
//c一直为数字
float e;
e=GetTopint(OPND)*10+(int)(c)-48;//刚才入栈的数乘10+现在的数
Popint(OPND);//出栈
Pushint(OPND,e);//把新的数e入栈
c=getchar();//获取下一个ASCII字符
}
}
else
switch(Precede(GetTopchar(OPRT),c)){//比较优先级(OPRT的栈顶元素,下一个ASCII字符)
case '<'://栈顶元素优先权低
Pushchar(OPRT,c);//入栈
c=getchar();
break;
case '='://脱括号并接收下一个字符
Popchar(OPRT);//销毁栈顶元素
c=getchar();
break;
case '>'://退栈并将运算结果入栈
theta=Popchar(OPRT);//获得运算符,销毁栈顶元素
b=Popint(OPND);//获得b //有先后顺序
a=Popint(OPND);//获得a
Pushint(OPND,Operate(a,theta,b));//进行运算,结果存入栈顶
break;
}//switch
}//while
printf("结果为:%-8.2f\n",GetTopint(OPND));
return 0;
}