表达式求值
2015-07-21 09:15
267 查看
表达式求值
时间限制:3000 ms | 内存限制:65535 KB难度:3
描述
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;
}
相关文章推荐
- 全排列
- Linux上启动vi时默认打开vim
- Git与Arc重用命令(不断更新)
- Android Studio使用技巧系列教程(一)
- 一些工具网址
- JSP+SSH实现默认全部导出或可选部分数据导出到Excel
- Servlet 获取完整URL
- Node.js面试问与答
- 使用缓存Memcache存储更新微信access token
- 一箭双雕打开Genesis
- 对象转化为 xml字符串
- 中国在全球经济格局以及产业链条上的地位已今非昔比
- 使用百度地图API进行Android地图应用开发(Eclipse)
- eclipse 关联 v4 源码的方法
- YTU-OJ-Problem K: 熟悉题型——代码完善(输出日期时间--友元函数)
- mysql查询一天,查询一周,查询一个月的数据
- JavaScript经典代码总结
- 如何像Python高手(Pythonista)一样编程
- UDP编程·client
- 内存泄漏检查工具valgrind使用方法