#include
#include
#include
#include
#define true 1
#define false 0
#define OPSETSIZE 8 //运算符集合数为8
char OPSET[OPSETSIZE] = { '+', '-', '*', '/', '(', ')', '#', '^' };
unsigned char Prior[8][8] =
{ /**********运算符优先级表***********/
// '+' '-' '*' '/' '(' ')' '#' '^'
/*'+'*/ '>', '>', '<', '<', '<', '>', '>', '<',
/*'-'*/ '>', '>', '<', '<', '<', '>', '>', '<',
/*'*'*/ '>', '>', '>', '>', '<', '>', '>', '<',
/*'/'*/ '>', '>', '>', '>', '<', '>', '>', '<',
/*'('*/ '<', '<', '<', '<', '<', '=', ' ', '<',
/*')'*/ '>', '>', '>', '>', ' ', '>', '>', '>',
/*'#'*/ '<', '<', '<', '<', '<', ' ', '=', '<',
/*'^'*/ '>', '>', '>', '>', '<', '>', '>', '>'
};
typedef int Status;
typedef struct StackChar
{
char oper;
struct StackChar next;
}SC; //StackChar类型的结点SC
typedef struct StackDouble
{
double num;
struct StackDouble *next;
}SD; //StackDouble类型的结点SD
/********FUN:SC类型的指针入栈,返回p **********/
SC Push(SC *s, char oper)
{
SC *p = (SC)malloc(sizeof(SC));
p->oper = oper;
p->next = s;
return p;
}
/***********FUN:SC类型的指针出栈**************/
SC Pop(SC *s)
{
SC *q = s;
s = s->next;
free(q);
return s;
}
/*********FUN:SF类型的指针入栈,返回p********/
SD Push(SD *s, double num)
{
SD *p = (SD)malloc(sizeof(SD));
p->num = num;
p->next = s;
return p;
}
/**************FUN:SF类型的指针出栈**********/
SD Pop(SD *s)
{
SD *q = s;
s = s->next;
free(q);
return s;
}
/***************FUN:计算 aθb 的逻辑操作****************/
double Calculator(double a, unsigned char theta, double b)
{
switch (theta)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a*b;
case '/': return a / b;
case '^': return pow(a, b);
default: return 0;
}
}
/***********Fun:判断输入运算符是否为8种标准运算符********/
Status Judge(char Test, char TestOp)
{
int i;
int Find = false;
for (i = 0; i< OPSETSIZE; i++)
{
if (Test == TestOp[i])
Find = true;
}
return Find;
}
/*************Fun:返回输入运算符的设定数值**************/
Status ReturnOpOrd(char oper, char TestOp)
{
int i;
for (i = 0; i< OPSETSIZE; i++)
{
if (oper == TestOp[i])
return i;
}
}
/*********FUN:比较运算符优先级**********/
char Precede(char Aop, char Bop)
{
return Prior[ReturnOpOrd(Aop, OPSET)][ReturnOpOrd(Bop, OPSET)];
}
/*************FUN:表达式求值*************/
double EvaluateExpression(char* Expression)
{
// OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
SC *OPTR = NULL; // 运算符栈,字符元素
SD *OPND = NULL; // 运算数栈,实数元素
char TempData[20] = ""; // 以字符形式临时存储数据
double Data, a, b;
char pc[50] = "", *c;
char theta, Dr[] = { '#', '\0' };
c = pc;
OPTR = Push(OPTR, '#'); //起始符#入栈
*c = strcat_s(Expression, sizeof(Expression), Dr); //表达式追加尾部#
while (*c != '#' || OPTR->oper != '#')
{
if (!Judge(*c, OPSET))
{
Dr[0] = *c;
strcat_s(TempData, sizeof(TempData), Dr); //字符串连接函数
c++;
if (Judge(*c, OPSET))
{
Data = (double)atof(TempData); //字符串转换函数
OPND = Push(OPND, Data);
strcpy_s(TempData,sizeof(TempData)," \0"); //清空临时存放数据的字符串
}
}
else // 不是运算符则进栈
{
switch (Precede(OPTR->oper, *c))
{
case '<': // 栈顶元素优先级低
OPTR = Push(OPTR, *c);
c++;
break;
case '=': // 脱括号并接收下一字符
OPTR = Pop(OPTR);
c++;
break;
case '>': // 退栈并将运算结果入栈
theta = OPTR->oper;
OPTR = Pop(OPTR);
b = OPND->num;
OPND = Pop(OPND);
a = OPND->num;
OPND = Pop(OPND);
OPND = Push(OPND, Calculator(a, theta, b));
break;
}
}
}
return OPND->num;
}
int main(void)
{
char s[128];
puts("请输入表达式:");
gets_s(s);
puts("该表达式的值为:");
printf("%s =%lf\n", s, EvaluateExpression(s));
system("pause"); //Press any key to exit
return 0;
}