题目

解题思路
思路是递归,递归函数的框架是:函数名(自变量字符串)。比如在A(abc)中,A是它的函数名,abc是它的自变量字符串;在B(A(xyz))中,B是它的函数名,括号里的A(xyz)算出来的值是B函数的自变量字符串。
递归函数里面,使用string res保存当前函数的括号里的自变量字符串,char ch保存当前的函数名。
依次读取字符串表达式,读到A~Z则说明出现新函数,保存在ch里,然后递归读取该函数括号里的内容(记得要循环,因为括号里面可能嵌套函数),获取完该函数括号里面所有的自变量字符串后,根据函数名进行函数值的映射,从而得到结果。而一旦读取到小写字母a~z,则把整串连续的小写字母返回,这串小写字母就是最近一个函数的自变量字符串。
具体实现看代码,注意一下左右括号的处理,时刻关注pos的值。
C++代码
#include<iostream>
#include<string>
using namespace std;
string recursion(string f[], string str, int& pos)
{
string res; //当前函数的答案
char ch = ' ';
if (str[pos] <= 'Z' && str[pos] >= 'A') //A到Z表示进入一个新函数
{
ch = str[pos]; //保存该函数的名称,便于进行值的映射
pos += 2; //直接跳过左括号'('
while (str[pos] != ')') //用循环因为括号里面可能嵌套函数
{
res += recursion(f, str, pos); //递归计算括号里的函数的答案,将它们相加
}
pos++; //跳过右括号')'
for (int i = 0; i < res.size(); i++) //进行函数值的计算
{
res[i] = f[ch - 'A' + 1][res[i] - 'a'];
}
return res;
}
//读到小写字母则把整串连续的小写字母返回,不需要计算函数值
else if (str[pos] >= 'a' && str[pos] <= 'z')
{
while (str[pos] != ')')
{
res += str[pos++];
}
return res;
}
}
int main()
{
string f[27];
for (int i = 1; i <= 26; i++)
cin >> f[i]; //A(x)....Z(x)
string str;
cin >> str; //表达式
int pos = 0;
while (pos < str.size()) //循环,直到整个字符串都被读取
cout << recursion(f, str, pos);
return 0;
}