表达式求值

来源:互联网 发布:bat执行java程序 编辑:程序博客网 时间:2024/06/07 01:17

表达式求值

时间限制: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行,每一行对应一个表达式的值。

样例输入
3add(1,2) max(1,999) add(min(1,1000),add(100,99)) 
样例输出
3999200

题目分析:这道题是典型的用栈来解决的问题、、

源代码如下:

代码一:

用数组来模拟栈来运算

#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;
}

0 0