表达式求值
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)-
输入
-
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。 样例输入
-
2 1.000+2/4= ((1+2)*5+1)/4=
样例输出
-
1.50 4.00
-
第一行输入一个整数n,共有n组测试数据(n<10)。
代码
#include<stdio.h>
#include<ctype.h>
#include<stack> //stl栈的运用
#define MAXSIZE 20
using namespace std;
stack<double>stack_num; //数栈
stack<char>stack_char; // 字符栈
//两个进行运算时用到的子函数
void calculator_1()
{
double num_1, num_2;
char ch;
ch = stack_char.top();
while(ch != '(') //一直弹栈 直到遇到‘(’
{ //没有比加减运算符优先级更低的运算符
num_1 = stack_num.top();
stack_num.pop();
num_2 = stack_num.top();
stack_num.pop();
switch(ch)
{
case '+':
num_2 += num_1;
break;
case '-':
num_2-= num_1;
break;
case '*':
num_2 *= num_1;
break;
case '/':
num_2 /= num_1;
break;
}
stack_num.push(num_2);
stack_char.pop();
ch = stack_char.top();
}
}
void calculator_2()
{
char ch;
double num_1, num_2;
ch = stack_char.top();
while(ch == '*' || ch == '/')
{
num_1 = stack_num.top();
stack_num.pop();
num_2 = stack_num.top();
stack_num.pop();
switch(ch) //只有在遇到‘*’‘/’时才弹栈
{
case '*':
num_2 *= num_1;
break;
case '/':
num_2 /= num_1;
break;
}
stack_num.push(num_2);
stack_char.pop();
ch = stack_char.top();
}
}
int main()
{
int num, k, i;
char str[MAXSIZE], str_1[MAXSIZE];
double num_1, num_2;
scanf("%d", &num);
getchar();
while(num--)
{
scanf("%s", str);
stack_char.push('('); // 开始时先将栈底压入一个‘(’,以后可以不用判断栈是否为空
k = 0;
for(i = 0; str[i]; i++)
{
if(isdigit(str[i]) || str[i] == '.') //将单个字符合为字符串 ctype函数
{
str_1[k++] = str[i];
continue;
}
str_1[k] = 0; //注意
if(str_1[0] != 0)
{
sscanf(str_1, "%lf", &num_1); //将字符串转化为数字
// num_1 = atof(str_1);
stack_num.push(num_1);
str_1[0] = 0;
}
k = 0;
switch(str[i])
{
case '(':
stack_char.push(str[i]);
break;
case '+': //加减以及‘=’都用calculator_1函数
case '-':
calculator_1();
stack_char.push(str[i]);
break;
case '*':
case '/':
calculator_2();
stack_char.push(str[i]);
break;
case ')':
case '=':
calculator_1();
stack_char.pop();
break;
}
}
printf("%.2lf\n", stack_num.top());
stack_num.pop();
}
return 0;
}