该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
#define OK 1
#define ERROR 0
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack1; //运算符栈类型定义
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack2; //操作数栈类型定义
SqStack1 OPTR; //运算符栈
SqStack2 OPND; //操作数栈
int EvaluateExpression(); //计算表达式值
void OPTR_InitStack(SqStack1 *S); //运算符栈的初始化
void OPND_InitStack(SqStack2 *S); //操作数栈的初始化
char OPTR_GetTop(SqStack1 S); //取运算符栈的栈顶元素
int OPND_GetTop(SqStack2 S); //取操作数栈的栈顶元素
char OPTR_Push(SqStack1 *S, char e); //压栈
int OPND_Push(SqStack2 *S, int e); //压栈
char OPTR_Pop(SqStack1 *S, char *e); //出栈
int OPND_Pop(SqStack2 *S, int *e); //出栈
char Precede(char a, char b); //运算符优先级比较
int Operate( int d, char e,int f); //操作数d、f参加e运算的结果
int In(char c); //判断c是否是运算符
void OPTR_Init_Stack(SqStack1 *S)//运算符栈的初始化
{
(*S).base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!(*S).base) exit (OVERFLOW);//存储分配失败
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}
void OPND_Init_Stack(SqStack2 *S)
{
(*S).base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!(*S).base) exit (OVERFLOW);//存储分配失败
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}
char OPTR_GetTop(SqStack1 S)//取运算符栈的栈顶元素
{
if(S.top==S.base) return ERROR;
return *(S.top-1);
return OK;
}
int OPND_GetTop(SqStack2 S) //取操作数栈的栈顶元素
{
if(S.top==S.base) return ERROR;
return *(S.top-1);
return OK;
}
char OPTR_Push(SqStack1 *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(ERROR);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*(*S).top=e;
(*S).top++;
return OK;
}
int OPND_Push(SqStack2 *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(ERROR);
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*(*S).top=e;
(*S).top++;
return OK;
}
char OPTR_Pop(SqStack1 *S, char *e) //出栈
{
if((*S).top==(*S).base) return ERROR;
*e=*--(*S).top;
return OK;
}
int OPND_Pop(SqStack2 *S, int *e) //出栈
{
if((*S).top==(*S).base) return ERROR;
*e=*--(*S).top;
return OK;
}
char Precede(char a, char b) //运算符优先级比较
{
char Op;
switch(a)
{
case '#':if(b=='#')
Op='=';
else Op='
case '+':if(b=='*' || b=='/' || b=='(' || b=='^')
Op='
else Op='>';break;
case '*':if(b=='(' || b=='^' )
Op='
else Op='>';break;
case '/':if(b=='(' || b=='^')
Op='
else Op='>';break;
case '(':if(b==')')
Op='=';
else Op='
case ')':Op='>';break;
case '^':if(b=='(')
Op='
else Op='>'; break;
}
return Op;
}
int Operate( int d, char e,int f) //操作数d、f参加e运算的结果
{
int g;
switch(e)
{
case '+':g=d+f;break;
case '-':g=d-f;break;
case '*':g=d*f;break;
case '/':g=d/f;break;
}
return g;
}
int In(char c) //判断c是否是运算符
{
if(c=='#' || c=='(' || c==')' || c=='+' || c=='-' || c=='*' || c=='/' || c=='^') return OK;
else if(c>='0' && c<='9') return OK;
else return ERROR;
}
int EvaluateExpression() //计算表达式值
{
int a,b;
char c,theta,x;
printf("请输入表达式\n");
OPTR_Init_Stack(&OPTR);OPTR_Push(&OPTR,'#');
OPND_Init_Stack(&OPND);c=getchar();
while(c!='#'||OPTR_GetTop(OPTR)!='#'){
if(!In(c))
{
OPND_Push(&OPND,(c-'0'));c=getchar();//不是运算符则进栈
}
else
switch(Precede(OPTR_GetTop(OPTR),c)){
case'
OPTR_Push(&OPTR,c);c=getchar();
break;
case'='://脱括号并接收下一字符
OPTR_Pop(&OPTR,&x);c=getchar();
break;
case'>'://退栈并将运算结果入栈
OPTR_Pop(&OPTR,&theta);
OPND_Pop(&OPND,&b);OPND_Pop(&OPND,&a);
OPND_Push(&OPND,Operate(a,theta,b));
break;
}
}
return OPND_GetTop(OPND);
}
int main()
{
int result;
result = EvaluateExpression();
printf("%d\n", result);
return OK;
}