表达式求值
-
描述
-
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
1. 一个正的十进制数 x 是一个表达式。
2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
-
输入
-
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
- 输出有N行,每一行对应一个表达式的值。 样例输入
-
3 add(1,2) max(1,999) add(min(1,1000),add(100,99))
样例输出
-
3 999 200
题目分析:这道题是典型的用栈来解决的问题、、源代码如下:
代码一:
用数组来模拟栈来运算
#include<stdio.h>
#include<string.h>
int add(int a,int b);//定义三个运算函数来进行三种运算
int max(int a,int b);
int min(int a,int b);
int main()
{
int len,i,t,sum,j,flag,top1,top2,n,num[100],m;//top1用来表示数据栈的顶端,top2用来表示字符栈顶端,num[100]数据栈,b[1000]字符栈。
char s[10000],b[10000];
scanf("%d",&t);
while(t--)
{
flag=0;
m=0;
n=0;
top1=0;
top2=0;
scanf("%s",s);
len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
n=n*10+s[i]-'0';//用来将数组中的数字转化为int型的数据,将单个数整合为整数。
}
else if(s[i]==','||s[i]==')')//循环进行,碰到“,”或”)“压入数据
{
if(n!=0)
{
num[top1++]=n;//将数据压入数据栈中
}
n=0;//让n归零以便下一组数据的计算。
}
else if(s[i]!=')')
{
b[top2++]=s[i];
}
if(s[i]==')')//碰到右括号表示一个表达式压入完毕,开始计算。
{
switch(b[top2-2])
{
case 'd':
{
flag=1;
m=add(num[top1-1],num[top1-2]);
top2=top2-4;//计算之后要将原先压入字符栈的元素出栈。
top1=top1-2;//j将压入数据栈的元素出栈。
num[top1]=m;//将新计算得出的元素压入栈
top1=top1+1;
break;
}
case 'n':
{
flag=1;
m=min(num[top1-1],num[top1-2]);
top2=top2-4;
top1=top1-2;
num[top1]=m;
top1=top1+1;
break;
}
case 'x':
{
flag=1;
m=max(num[top1-1],num[top1-2]);
top2=top2-4;
top1=top1-2;
num[top1]=m;
top1=top1+1;
break;
}
}
}
}
if(flag==1)
{
printf("%d\n",m);
}
else
{
printf("%d\n",n);
}
}
return 0;
}
int add(int a,int b)
{
return a+b;
}
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
int min(int a,int b)
{
if(a>b)
{
return b;
}
else
{
return a;
}
}代码二:
用C++的栈容器来计算
#include<stdio.h>
#include<string.h>
#include<stack>
#define M 301
using namespace std;
stack<char>sata;
stack<int>data;
int main()
{
int n,i,len,k,a,b,c,flag;
char s[M];
scanf("%d",&n);
while(n--)
{
flag=0;
k=0;
scanf("%s",s);
len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
k=k*10+s[i]-'0';
flag=1;
}
else if(s[i]==','||s[i]==')')//逗号不会被压进栈。
{
if(flag==1&&k!=0)
{
data.push(k);
k=0;
}
}
else if(s[i]!=')')
{
sata.push(s[i]);
}
c=k;//倘若输入进去的是一个单数字,则输出这个单数字。
if(s[i]==')')
{
a=data.top();
data.pop();
b=data.top();
data.pop();
sata.pop();
switch(sata.top())
{
case 'd':c=a+b;data.push(c);sata.pop();sata.pop();sata.pop();break;
case 'n':if(a>b)c=b;else c=a;data.push(c);sata.pop();sata.pop();sata.pop();break;
case 'x':if(a>b)c=a;else c=b;data.push(c);sata.pop();sata.pop();sata.pop();break;
}
}
}
printf("%d\n",c);
}
return 0;
}
-
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)