#include "stdafx.h"
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define STACKINCREMENT 10
#define STACK_INIT_SIZE 100
typedef int Status;
typedef struct
{
char *base;
char *top;
int stacksize;
}OPTRStack; //操作符栈
typedef struct
{
int *base;
int *top;
int stacksize;
}OPNDStack; //操作数栈
Status Init(OPTRStack &S)
{
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
} //初始化操作符栈
Status Init(OPNDStack &S)
{
S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//初始化操作数栈
char GetTop(OPTRStack S)
{
char e;
if(S.top==S.base) return ERROR;
return e=*(S.top-1);
}//若操作符栈不空,则用e返回栈的栈顶元素
int GetTop(OPNDStack S)
{
int e;
if(S.top==S.base) return ERROR;
return e=*(S.top-1);
}//若操作数栈不空,则用e返回栈的栈顶元素
Status Push(OPTRStack &S,char e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//进操作符栈
int Push(OPNDStack &S,int e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return *S.top;
}//进操作数栈
char Pop(OPTRStack &S)
{
if(S.top==S.base) return '0';
return *--S.top;
}//出操作符栈
int Pop(OPNDStack &S)
{
int e;
if(S.top==S.base) return ERROR;
e=*--S.top;
return e;
}//出操作数栈
Status Judge(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') return OK;
else return ERROR;
}//若c是这五个字符之一,则返回OK;否则返回ERROR
char Compare(char a,char b)
{
if(a=='+')
{
if(b=='*'||b=='/'||b=='(') return '<';
else return '>';
}
else if(a=='-')
{
if(b=='*'||b=='/'||b=='(') return '<';
else return '>';
}
else if(a=='*')
{
if(b=='(')return '<';
else return '>';
}
else if(a=='/')
{
if(b=='(')return '<';
else return '>';
}
else if(a=='(')
{
if(b==')')return '=';
else if(b=='#') return '0';
else return '<';
}
else if(a==')')
{
if(b=='(')return '0';
else return '>';
}
else if(a=='#')
{
if(b==')')return '0';
if(b=='#')return '=';
else return '<';
}
}//运算符的自定义优先级比较
int Calculate(int left,int right, char operators)
{
if(operators=='+') return left+right;
else if(operators=='-') return left-right;
else if(operators=='*') return left*right;
else if(operators=='/')
{
if(right==0) {printf("Attention:denominatotr cannot be '0'\n");return 0;}
else return left/right;
}
}//计算
void Fun(OPTRStack &OPTR,OPNDStack &OPND,char c)
{
if(Compare(GetTop(OPTR),c)=='<')
{
Push(OPTR,c);
c=getchar();
}
else if(Compare(GetTop(OPTR),c)=='=')
{
if(c!='#')
{Pop(OPTR);
c=getchar();}
else
printf("The Answer is:%d\n",GetTop(OPND));
}
else if(Compare(GetTop(OPTR),c)=='>')
{
int left,right;
char operators=Pop(OPTR);
right=Pop(OPND);
left=Pop(OPND);
Push(OPND,Calculate(left,right,operators));
Fun(OPTR,OPND,c);
}
}
void f(OPTRStack OPTR,OPNDStack OPND,int *p1,int *p2,char c)
{
c=getchar();
while(!Judge(c))
{
int top;
top=GetTop(OPND);
p1=⊤
int b=c-48;
p2=&b;
Pop(OPND);
Push(OPND,(*p1)*10+(*p2));
c=getchar();
}
//printf("%d\n",GetTop(OPND));
}
int main()
{
OPTRStack OPTR; //操作符栈
OPNDStack OPND; //操作数栈
int a;
char b;
int *p1,*p2;
p1=(int*)malloc(sizeof(int));
p2=(int*)malloc(sizeof(int));
Init(OPTR);
Init(OPND);
printf("Please input expression(以“#”结束):\n");
Push(OPTR,'#');
char c;
c=getchar();//输入第一个字符
while(c!='#'||GetTop(OPTR)!='#') //遇到'#'跳出while语句
{
if(Judge(c)) {
a=c-48;
Push(OPND,a);
f(OPTR,OPND,p1,p2,c);
} //c是操作符
else{
Fun(OPTR,OPND,c);
} //c是操作数
}
printf("The answer=%d",GetTop(OPND));
getchar();
return OK;}