之前在oj做过两道表达式求值的题,去年省赛的化学表达式求值,以及前几年的add,max,min表达式求值,由于没学数据结构(..借口),自己用的数组写的(好累)。不过这道题若用数组写,反正我写不出来,也想过用栈来写,但是只想着开一个栈,实现不了,后来看了同学的代码,原来要开两个栈来写,一个存数字,一个存符号。
还学到了一个很方便的函数,atof和atoi,头文件是<stdlib.h>;
表达式求值
时间限制:
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
来源
- 数据结构课本例题改进
- 代码贴上:
-
01.
#include<stdio.h>
02.
#include<stdlib.h>
03.
#include<string.h>
04.
#include<stack>
05.
using
namespace
std;
06.
double
js(
double
x,
double
y,
char
c)
07.
{
08.
switch
(c)
09.
{
10.
case
'+'
:
return
x+y;
11.
case
'-'
:
return
x-y;
12.
case
'*'
:
return
x*y;
13.
case
'/'
:
return
x/y;
14.
}
15.
}
16.
char
bj(
char
a,
char
b)
17.
{
18.
if
(a==
'+'
||a==
'-'
)
19.
{
20.
if
(b==
'*'
||b==
'/'
||b==
'('
)
21.
return
'<'
;
22.
return
'>'
;
23.
}
24.
if
(a==
'*'
||a==
'/'
)
25.
{
26.
if
(b==
'('
)
27.
return
'<'
;
28.
return
'>'
;
29.
}
30.
if
(a==
'='
||a==
'('
)
31.
{
32.
if
(a==
'('
&&b==
')'
||a==
'='
&&b==
'='
)
33.
return
'='
;
34.
return
'<'
;
35.
}
36.
}
37.
int
main()
38.
{
39.
int
N;
40.
scanf
(
"%d"
,&N);
41.
while
(N--)
42.
{
43.
char
a[1010],b[1010];
44.
stack<
char
>zf;
45.
stack<
double
>shu;
46.
double
x,y;
47.
scanf
(
"%s"
,a);
48.
int
i,f=0,k=0;
49.
zf.push(
'='
);
50.
for
(i=0;a[i]!=
'\0'
;i++)
51.
{
52.
if
(a[i]>=
'0'
&&a[i]<=
'9'
||a[i]==
'.'
)
53.
{
54.
b[k++]=a[i];
55.
f=1;
56.
continue
;
57.
}
58.
if
(f)
59.
{
60.
b[k]=
'\0'
;
61.
shu.push(
atof
(b));
62.
f=0;
63.
k=0;
64.
}
65.
switch
(bj(zf.top(),a[i]))
66.
{
67.
case
'<'
: zf.push(a[i]);
break
;
68.
case
'='
:zf.pop();
break
;
69.
case
'>'
:
70.
y=shu.top(),shu.pop();
71.
x=shu.top(),shu.pop();
72.
shu.push(js(x,y,zf.top()));
73.
zf.pop();i--;
break
;
74.
}
75.
}
76.
printf
(
"%.2lf\n"
,shu.top());
77.
}
78.
}
-
第一行输入一个整数n,共有n组测试数据(n<10)。