问题描述
令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值。
只有满足以下要求的表达式才是合法的:
1.任意整数x是一个合法的表达式;
2.如果A和B都是合法的表达式,则f(A,B)也是一个合法的表达式。
输入格式
第一行两个数a和b;
第二行一个字符串S表示要求的表达式。
输出格式
一行一个数表示表达式S的值。
样例输入
1 2
f(1,f(1,-1))
样例输出
-1
此题与后缀表达式求值差不多即依次读取s当其为操作数的时候就入栈,为右括号时出两个操作数进行f(x,y)运算并将结果入栈。解决一下几点问题,就等于解决了问题。
1.如何判断一个字符是数字。
2.如何将存贮在字符数组中连续的数字变成一个整型的数。
3.栈的使用。
# include<iostream>
# include<stack>
# include<string>
using namespace std;
int a,b;
string sf;
int f(int x,int y)
{
return a*x+b*y;
}
int getnum(int &i,bool minus)
{
int num=0;
while(sf[i]>='0'&&sf[i]<='9')
{
num=num*10+sf[i]-'0';
i++;
}
if(minus) num=-num;
return num;
}
int main()
{
stack<int> s;
cin>>a>>b>>sf;
int sf_length=sf.length();
s.push(0);
int i;
for(i=0;i<sf_length;i++)
{
if(sf[i]=='-')
{
i++;
s.push(getnum(i,true));
}
else if(sf[i]>='0'&&sf[i]<='9')
{
s.push(getnum(i,false));
}
if(sf[i]==')')
{
int y=s.top();
s.pop();
int x=s.top();
s.pop();
s.push(f(x,y));
}
}
cout<<s.top()<<endl;
return 0;
}