/* 头文件 */
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char ElemType;
typedef int Status;
typedef char SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
SqStack OPTR;
SqStack OPND;
int a,b,result;
char x,theta,c;
/*源文件*/
/* ============== Program Description ============= */
/* Freshare's 2nd_1 of dswork */
/* ================================================== */
#include "stdio.h"
#include "2nd.h"
int In(char c) // 判断是否为运算符
{
if ( c=='(' || c=='+' || c=='-' || c == '*' || c=='/' || c==')' || c=='#')
return TRUE;
else return FALSE ;
}
int Operate ( char d ,char e,char f) //计算
{
int uu;
switch(e)
{
case '+':
uu=d+f;
break;
case '-':
uu=d-f;
break;
case '*':
uu=d*f;
break;
case '/':
uu=d/f;
break;
}
return uu;
}
char Precede(char a,char b) //判断优先级
{
char op;
switch(a)
{
case '#':
if (b=='#') op='=';else op='<';
break;
case '+':
if (b=='+'||b=='-'||b==')'||b=='#') op='>';else op='<';
break;
case '-':
if (b=='*'||b=='/'||b=='(') op='<';else op='>';
break;
case '*':
if (b=='(') op='<';else op='>';
break;
case '/':
if (b=='(') op='<';else op='>';
break;
case '(':
if (b==')') op='=';else op='<';
break;
case ')':
op='>';
break;
}
return op;
}
SqStack InitStack( SqStack s) //初始化
{
s.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s.base) exit (OVERFLOW);
s.top=s.base;
s.stacksize = STACK_INIT_SIZE ;
return s;
}
SElemType GetTop ( SqStack S) //GetTop
{
SElemType e;
if ( S.top == S.base) return ERROR;
e = *( S.top -1 );
return e ;
}
SqStack Push ( SqStack S , SElemType e) //Push
{
if ( S.top - S.base >= S.stacksize )
{
S.base = (ElemType *) realloc (S.base ,
(S.stacksize + STACKINCREMENT) * sizeof(ElemType));
if(!S.base) exit (OVERFLOW);
S.top = S.base +S.stacksize ;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return S ;
}
int Pop_OPND () //Pop
{
if( OPND.top == OPND.base) return ERROR ;
return *--OPND.top ;
}
char Pop_OPTR () //Pop
{
if( OPTR.top == OPTR.base) return ERROR ;
return *--OPTR.top ;
}
SElemType EvaluateExpression() //EvaluateExpression
{
OPTR=InitStack (OPTR);
OPTR=Push(OPTR,'#');
OPND=InitStack (OPND);
c = getchar();
while (c!='#'||GetTop(OPTR)!='#')
{
if (!In(c))
{
c-=48;
OPND=Push (OPND,c);
c =getchar();
}
else
switch (Precede (GetTop(OPTR),c))
{
case '<':
OPTR=Push(OPTR,c); c=getchar();
break;
case '=':
x=Pop_OPTR(); c=getchar();
break;
case '>':
theta=Pop_OPTR();
b=Pop_OPND();
a=Pop_OPND();
OPND=Push(OPND,Operate(a,theta,b));
break;
}
}
return (GetTop(OPND));
}
void main()
{
printf("请输入一个表达式,并以#号结束:/n>>>>");
result=EvaluateExpression();
printf(">>>>结果是:%d/n",result);
getchar();
}