描述:
输入为四则运算表达式,仅由数字,+,-,*,/,()组成,没有空格,要求求其值。假设运算符算出来的结果都为整数,‘/’也是整数。
输入:
一串四则运算表达式
输出:
该表达式的值
样例输入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类型变量”)判断这个字符中是否是数字(程序中的意思)
判断一个变量是否是数字
在这里我还要提一下,如果想要这个程序的详细解读,可以看一下我的“哔哩哔哩”看一下我的第一个视频“表达式求值”,谢谢了。
小小问答;
请大家看看这三个函数,将三个函数名翻译成中文,里面的内容就是我下一章要讲的了,拜拜了。