C语言表达式的值是什么,表达式求值的c语言代码是什么

ef4b31c07d9cec207cf3caede09dd47b.png

二.包括括号运算(粘贴修改部分)int Judge_optr(char top)//用于判断字符ch是否是运算符

{

int x;

//cout << top << "test" << endl;

switch (top)

{

case '(':

x = 0; break;

case '+':

case '-':

x = 1; break;

case '*':

case '/':

x = 2; break;

case ')':

x = 3; break;

}

return x;

}

double Operate(double b, double a, char top) //用于计算当前的值,并将该值返回

{

double c = 0;

switch (top)

{

case '+':

c = b + a;

break;

case '-':

c = b - a;

break;

case '*':

c = b * a;

break;

case '/':

if (a == 0)

{

printf("分母为零!

");

return 0;

}

else

c = b / a;

break;

default:

printf("输入的字符非法!

");

break;

}

return c;

}

void Jsbds_operate(char str[]) //读入一个简单算术表达式,并将计算结果返回到主函数

{

OptrStack *optr = Init_OptrStack(); //初始化操作符栈

OpndStack *opnd = Init_OpndStack(); //初始化操作数栈

int i, j; //i,j为循环变量,a,b接收从操作数栈中出栈的元素

double f; //接收将字符数转换为浮点数的值

double a = 0;

double b = 0;

double c = 0;

char d[100]; //储存字符串中连续的‘数’

char top = 0; //接收从操作符栈中出栈的元素

for (i = 0; str[i]; i++) //将字符串中的元素按顺序入到栈中

{

switch (str[i])

{

case '(':

case '+':

case '-':

/*先判断当前运算符与操作符栈栈顶元素的优先级,如果高于栈顶元素,则入栈;

小于栈顶元素,则从操作数栈中依次出两个数,并将操作符栈中栈顶元素出栈,

再将从操作数栈中出的两个数,按从操作符栈栈中出的运算符运算,

并将结果压入操作数栈中,再将当前的操作符压入操作符栈中。*/

if ((!Empty_OptrStack(optr)) || (Judge_optr(str[i]) > Judge_optr(GetTop_OptrStack(optr, top)))||(str[i]=='(')) //当操作符栈为空的时候压栈保存

{

Push_OptrStack(optr, str[i]);

}

else

{

a = Pop_OpndStack(opnd, a); //接收从操作数栈中出栈的元素

b = Pop_OpndStack(opnd, b); //接收从操作数栈中出栈的元素

top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素

c = Operate(b, a, top);

Push_OpndStack(opnd, c);

//将计算后的值压入操作数栈中

Push_OptrStack(optr, str[i]);

}

break;

case '*':

case '/':

if ((!Empty_OptrStack(optr)) || (Judge_optr(str[i]) > Judge_optr(GetTop_OptrStack(optr, top))) || (str[i] == '('))

{ //当操作符栈为空或者该操作符的优先级大于栈顶元素的优先级是入栈保存

Push_OptrStack(optr, str[i]);

}

else

{

a = Pop_OpndStack(opnd, a);//接收从操作数栈中出栈的元素

b = Pop_OpndStack(opnd, b);//接收从操作数栈中出栈的元素

top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素

c = Operate(b, a, top);

Push_OpndStack(opnd, c);

//将计算后的值压入操作数栈中

Push_OptrStack(optr, str[i]);

}

break;

case ')':

Push_OptrStack(optr, str[i]);

break;

case '':

break;

default:

j = 0;

do

{

d[j++] = str[i];

i++;

} while (str[i] >= '0' && str[i] <= '9'); //可存入一个或多个数字字符

d[j] = ''; //将输入的连续多个数字字符拼成了字符串

i--;

f = atof(d); //调用库函数atoi()将字符数转换为浮点数

Push_OpndStack(opnd, f); //将转换后的数压入操作数栈中

break;

}

}

while (Empty_OptrStack(optr)) //当操作符栈不为空的时候执行

{

if ((GetTop_OptrStack(optr, top) == ')') || (GetTop_OptrStack(optr, top) == '('))

{

top=Pop_OptrStack(optr, top);

}

else

{

a = Pop_OpndStack(opnd, a);//接收从操作数栈中出栈的元素

b = Pop_OpndStack(opnd, b);//接收从操作数栈中出栈的元素

top = Pop_OptrStack(optr, top);//接收从操作符栈中出栈的元素

c = Operate(b, a, top);

Push_OpndStack(opnd, c);

//将计算后的值压入操作数栈中

}

}

cout << "该表达式的计算结果为:";

std::cout << GetTop_OpndStack(opnd, c) << endl;//将操作数栈中的元素(即表达式的最终结果)打印出来

}

推荐教程:《C视频教程》

表达式求值的c语言代码是什么相关教程

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值