表达式求值

 描述:

输入为四则运算表达式,仅由数字,+,-,*,/,()组成,没有空格,要求求其值。假设运算符算出来的结果都为整数,‘/’也是整数。

输入:

一串四则运算表达式

输出:

该表达式的值

样例输入1:

(6+4)*5

样例输出1:

50

样例输入2:

5+9/3-4

样例输出2:

4

  这道题我们可以用递归的方法来解决,我们可以用三个函数来进行解决,第一个函数是来判断用括号内的,也是来判断哪几个数相加相乘......转移到相对于的函数上面,第二个函数是专门来处理运算符是乘除*/的,第三个函数是将分开的表达式加在一起,是负责加减+-的。 

代码:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int factor_value();
int term_value();
int expression_value();
int factor_value()
{
    int result1=0;
    char c=cin.peek();
    if(c=='(') 
    {
        cin.get();
        result1=expression_value();
        cin.get();
    }
    else 
	{
        while(isdigit(c)) 
		{
            result1=10*result1+c-'0';
            cin.get();
            c=cin.peek();
        } 
    }
    return result1;
}
int term_value() 
{
    int result2=factor_value();
    while(true) 
	{
        char op = cin.peek();
        if(op=='*'||op=='/')
		{
            cin.get();
            int value1=factor_value();
            if(op=='*') 
              result2*=value1;
            else result2/=value1;
        }
        else 
          break;
    }
    return result2;
}
int expression_value()
{
	int result=term_value();
    bool more=true;
    while(more) 
	{
        char op=cin.peek();
        if(op=='+'||op=='-') 
		{
            cin.get();
            int value=term_value();
            if(op=='+') result+=value;
            else result-=value;
        }
        else more=false;
    }
    return result;
}
int main()
{
    cout << expression_value() << endl;
    return 0;
}

这里面有多个比较陌生的函数,我们一起来看看。

cin.penk观看一个字符串中的第一个字符,不取走(程序中的意思)

  cin.peek()的返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测
指针停留在当前位置并不后移;如果要访问的字符是文件结束符,则函数值是-1

cin.get将一个字符串的第一个字符取走(程序中的意思)

1、cin.get()

用来从指定的输入流中提取一个字符(包括空白字符),
函数的返回值就是读入的字符。若遇到输入流中的文件结束符,
则函数值返回文件结束标志EOF(End Of File),一般以-1代表EOF

2、 cin.get(字符数组, 字符个数n, 终止字符) 
其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回true(真),如失败(遇文件结束符) 则函数返回false(假)。

isdigit(“一个cahr类型变量”)判断这个字符中是否是数字(程序中的意思)

判断一个变量是否是数字

在这里我还要提一下,如果想要这个程序的详细解读,可以看一下我的“哔哩哔哩”看一下我的第一个视频“表达式求值”,谢谢了。

​​​​​​​表达式求值_哔哩哔哩_bilibili由11岁小朋友讲的C++递归例题“表达式求值”https://www.bilibili.com/video/BV1QR4y1w75s?share_source=copy_web

小小问答;

  请大家看看这三个函数,将三个函数名翻译成中文,里面的内容就是我下一章要讲的了,拜拜了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值