您的位置:首页 > 其它

表达式求值

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: