问题描述
令二元函数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
解题思路:本题主要用到栈的性质,对表达式进行遍历如果遇到数字就将数字进栈,这里数字可能有多位所以需要循环判断,数字也可能是负数所以需要注意。然后遇到’)'就将占中两个元素出栈,这里要注意先出栈的是乘b后出栈的乘a。
#include<cstdio>
#include<stack>
#include<string>
#include<iostream>
using namespace std;
int main(void) {
int a, b;
stack<int> st;
string s;
cin >> a >> b;
cin >> s;
for (int i = 0; i < s.size(); i++) {
int num = 0;
int flag = 1;
if (s[i] >= '0' && s[i] <= '9' || s[i] == '-') {
while (s[i] >= '0' && s[i] <= '9' || s[i] == '-') {
if (s[i] == '-') {
i++;
flag = -1;
}
num = num * 10 + s[i] - '0';
i++;
}
st.push(num*flag);
}
if (s[i] == ')') {
int num1 = st.top();
st.pop();
int num2 = st.top();
st.pop();
st.push(num2*a + num1 * b);
}
}
printf("%d", st.top());
return 0;
}