问题描述
令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值。
只有满足以下要求的表达式才是合法的:
1.任意整数x是一个合法的表达式;
2.如果A和B都是合法的表达式,则f(A,B)也是一个合法的表达式。
只有满足以下要求的表达式才是合法的:
1.任意整数x是一个合法的表达式;
2.如果A和B都是合法的表达式,则f(A,B)也是一个合法的表达式。
输入格式
第一行两个数a和b;
第二行一个字符串S表示要求的表达式。
第二行一个字符串S表示要求的表达式。
输出格式
一行一个数表示表达式S的值。
样例输入
1 2
f(1,f(1,-1))
f(1,f(1,-1))
样例输出
-1
数据规模和约定
S的长度不超过50,运算过程中所有变量不会超出int的范围。
想到了用栈,没做出来。
没做出来的原因分析:
1:如果有f(12, 123)这样的12,123多位数字如何操作。正解应是传递引用的形参表示索引
2:什么时候弹出栈顶元素没有想到,其实可以不用考虑字符f和左括号的。
参考自https://blog.csdn.net/qq_42914633/article/details/87558740
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a, b; //表达式里的系数 4 string sf; //输入的字符串 5 int f(int x, int y) { //返回一个f表达式的值 6 return a * x + b * y; 7 } 8 int getnum(int &i, bool minus) { //参数i为引用参数,minus用于判断是否是负数 9 int num = 0; 10 while (sf[i] >= '0' && sf[i] <= '9') { //此处为while,即如果下一个字符也为数字的话,把下一位数字也加上 11 num = num * 10 + sf[i] - '0'; 12 i++; 13 } 14 if (minus) { 15 num = -num; 16 } 17 return num; 18 } 19 int main() { 20 stack<int> s; 21 cin >> a >> b >> sf; 22 int len = sf.length(); 23 s.push(0); //首先压入0,若输入空字符串,应弹出0 24 for (int i = 0; i < len; i++) { 25 if (sf[i] == '-') { //如果这一位是负号,下一位一定是数字,i移动到下一位 26 i++; 27 s.push(getnum(i, true)); 28 } else if (sf[i] >= '0' && sf[i] <= '9') { //如果这一位是数字的话压入数字(必为正数,负数在上一个if那里判断了) 29 s.push(getnum(i, false)); 30 } 31 if (sf[i] == ')') { //如果这一位是右括号,意味着有一个f表达式可以计算了 32 int y = s.top(); 33 s.pop(); 34 int x = s.top(); 35 s.pop(); 36 s.push(f(x, y)); 37 } 38 } 39 cout << s.top() << endl; 40 return 0; 41 }