CCF CSP 第37次(2025.03)(3_模板展开_C++)
时间限制: 1.0 秒
空间限制: 512 MiB
原题链接
解题思路:
思路一(哈希表+stringstream):
1、解题步骤拆分:
① 数据输入:
- 第一行输入一个整数n(模板语言的语句数量)。
- 接下来 n 行,每行一个语句。
② 数据处理:
- 表达式中 $ a 代表 a 为字符串变量 ,表达式无 $ 则代表普通字符串 如 “a”
- 存在三种类型:
类型1:第一个元素为1,此时第二个元素为变量,后边元素为表达式(表达式中的变量 无需 转换成对应的值)
类型2:第一个元素为2,此时第二个元素为变量,后边元素为表达式(表达式中的变量 需要 转换成对应的值)
类型3:第一个元素为3,此时第二个元素为变量,后边表达式中存在变量需转换($)后输出,且输出的是字符串的长度。
在这里存储变量的一一对应关系可以想到哈希表
③ 数据输出:即 数据处理中的类型 3 。
代码实现
代码实现(思路一(哈希表+stringstream)):
#include<iostream>
#include<vector>
#include<sstream>
#include<unordered_map>
using namespace std;
// 这个函数用来根据给定的表达式计算结果,表达式可以包含变量。
// `expr` 是表达式,`variables` 是存储所有变量及其值的映射。
string evaluate_expression(const string &expr, unordered_map<string, string> &variables){
stringstream ss(expr); // 用 stringstream 逐步处理表达式
string part, result;
// 将表达式按空格分割并逐个处理
while (ss >> part) {
// 如果部分是变量(以 '$' 开头),从 variables 中获取对应的值
if (part[0] == '$') {
string var_name = part.substr(1); // 去掉 '$',提取变量名
result += variables[var_name]; // 拼接变量的值到结果字符串
} else {
result += part; // 如果不是变量,直接拼接字符串
}
}
return result; // 返回最终的拼接结果
}
int main(int argc, char const *argv[]) {
int n; // 模板语言的语句数量
cin >> n;
cin.ignore(); // 忽略输入中的换行符
unordered_map<string, string> variables; // 存储已定义的变量及其值
unordered_map<string, string> delayed; // 存储待延迟求值的表达式
// 处理接下来的 n 行,每行为一个语句
for (int i = 0; i < n; i++) {
string line;
getline(cin, line); // 读取每一行输入
stringstream ss(line);
string type;
ss >> type; // 读取语句的类型(1、2 或 3)
if (type == "1") { // 类型 1: 定义变量
string var, expr;
ss >> var; // 读取变量名
getline(ss, expr); // 读取变量表达式
// 计算表达式的值并将结果存入变量中
string value = evaluate_expression(expr, variables);
variables[var] = value; // 存储变量及其计算后的值
} else if (type == "2") { // 类型 2: 延迟定义变量
string var, expr;
ss >> var; // 读取变量名
getline(ss, expr); // 读取变量表达式
// 将变量和对应的表达式存入 delayed 中
delayed[var] = expr;
} else if (type == "3") { // 类型 3: 输出变量的长度
string var;
ss >> var; // 读取变量名
// 如果变量不存在于 delayed 和 variables 中,输出 0
if (!delayed.count(var) && !variables.count(var)) {
cout << 0 << endl;
continue;
}
// 如果变量在 delayed 中,先计算其值并存入 variables
if (delayed.count(var)) {
string expr = delayed[var];
string value = evaluate_expression(expr, variables);
variables[var] = value;
}
// 输出变量的值的长度,取模 1000000007
string value = variables[var];
cout << value.length() % 1000000007 << endl;
}
}
return 0; // 程序结束
}
部分代码解读
//stringstream的用法
void function_stringstream (){
//1、将字符串转换为整数
stringstream ss1("123");
int num1;
ss1>>num1;
cout<<num1<<endl;
//2、将整数转换为字符串
stringstream ss2;
int num2=123;
ss2<<num2;
string str=ss2.str();
cout<<str<<endl;
//3、逐步解析字符串
stringstream ss3("10 20 30");
int a,b,c;
ss3>>a>>b>>c;
cout<<a<<b<<c<<endl;
//4、字符串拼接
stringstream ss4;
int num4=10;
string str4= "The number is ";
ss4<<str4<<num4;
string result = ss4.str();
cout<<result<<endl;
}
欢迎大家和我沟通交流(✿◠‿◠)