php表达式求值,C语言堆栈实现表达式求值

#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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值