#include
#include
#include
typedef struct Snode {
char data;
struct Snode *next;
}Snode, *LinkStack;
int InitStack(LinkStack &S) {
//创建一个空链栈
S = NULL;
return 1;
}
bool Push(LinkStack &S, char e) //在栈顶插入元素e
{
LinkStack p;
p = (LinkStack)malloc(sizeof(Snode)); //生成新结点
p->data = e; //将e放在新结点数据域
p->next = S; //将新结点的指针域指向S,即将S的地址赋值给新结点的指针域
S = p; //修改栈顶指针为p
return true;
}
bool Pop(LinkStack &S, char &e) //删除S的栈顶元素,用e保存其值
{
LinkStack p;
if (S == NULL) //栈空
return false;
e = S->data; //将栈顶元素赋给e
p = S; //用p保存栈顶元素地址,以备释放
S = S->next; //修改栈顶指针,指向下一个结点
free(p); //释放原栈顶元素的空间
return true;
}
int GetTop(LinkStack S) //返回S的栈顶元素,不修改栈顶指针
{
if (S != NULL) //栈非空
return S->data; //返回栈顶元素的值,栈顶指针不变
else
return 0;
}
typedef struct iSnode {
double data;
struct iSnode *next;
}iSnode, *iLinkStack;
int initStack(iLinkStack &S) {
S = NULL;
return 1;
}
bool Push(iLinkStack &S, double e) //在栈顶插入元素e
{
iLinkStack p;
p = (iLinkStack)malloc(sizeof(iSnode)); //生成新结点
p->data = e; //将e放在新结点数据域
p->next = S; //将新结点的指针域指向S,即将S的地址赋值给新结点的指针域
S = p; //修改栈顶指针为p
return true;
}
bool Pop(iLinkStack &S, double &e) //删除S的栈顶元素,用e保存其值
{
iLinkStack p;
if (S == NULL) //栈空
return false;
e = S->data; //将栈顶元素赋给e
p = S; //用p保存栈顶元素地址,以备释放
S = S->next; //修改栈顶指针,指向下一个结点
free(p); //释放原栈顶元素的空间
return true;
}
double GetTop(iLinkStack S) //返回S的栈顶元素,不修改栈顶指针
{
if (S != NULL) //栈非空
return S->data; //返回栈顶元素的值,栈顶指针不变
else
return 0;
}
int In(char ch)
{//判断ch是否为运算符
if (ch == '+')
return 1;
else if (ch == '-')
return 1;
else if (ch == '*')
return 1;
else if (ch == '/')
return 1;
else if (ch == '#')
return 1;
else if (ch == '(')
return 1;
else if (ch == ')')
return 1;
else
return 0;
}
char Precede(char t1,char t2)
{//按表定义运算符优先级
switch(t1)
{
case '+':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '
case '/':return '
case '(':return '
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '-':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '
case '/':return '
case '(':return '
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '*':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '/':
switch(t2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '/':return '>';break;
case '(':return '
case ')':return '>';break;
case '#':return '>';break;
}
break;
case '(':
switch(t2)
{
case '+':return '
case '-':return '
case '*':return '
case '/':return '
case '(':return '
case ')':return '=';break;
case '#':return '>';break;
}
break;
case ')':
switch(t2)
{
case '+':return '>'; break;
case '-':return '>'; break;
case '*':return '>'; break;
case '/':return '>'; break;
case '(':return '='; break;
case ')':return '>'; break;
case '#':return '>'; break;
}
break;
case '#':
switch (t2)
{
case '+':return '
case '-':return '
case '*':return '
case '/':return '
case '(':return '
case ')':return '
case '#':return '='; break;
}
break;
}
}
double Operate(double a,char theta,double b)
{//计算a theta b
switch (theta)
{
case '+':
return a + b;
break;
case '-':
return a - b;
break;
case '*':
return a * b;
break;
case '/':
return a / b;
break;
}
}
double EvaluateExpression() {
//算术表达式的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈
char c, x, theta;
double a, b;
LinkStack OPTR;
iLinkStack OPND;
InitStack(OPTR); Push(OPTR, '#');
initStack(OPND); c = getchar();
int fl = 0;
while (c != '#' || GetTop(OPTR) != '#')
{
if (!In(c)) {
if (!In(GetTop(OPND))&&fl) {
double tmp = GetTop(OPND);
double t;
Pop(OPND, t);
Push(OPND, (c - 48) + tmp*10);
c = getchar();
}
else {
Push(OPND, c - 48);
c = getchar();
fl = 1;
}
}//不是运算符则进栈
else {
fl = 0;
switch (Precede(GetTop(OPTR), c))
{
case'
Push(OPTR, c); c = getchar();
break;
case'=':
Pop(OPTR, x); c = getchar();
break;
case'>':
Pop(OPTR, theta);
Pop(OPND, b); Pop(OPND, a);
/*printf("resu:%lf\n", Operate(a, theta, b));
printf("gt:%lf\n", GetTop(OPND));*/
Push(OPND, Operate(a, theta, b));
break;
}
}
}
return GetTop(OPND);
}
int main() {
printf("%lf\n", EvaluateExpression());
system("pause");
return 0;
}