CCF CSP 第37次(2025.03)(3_模板展开_C++)
- 解题思路:
- 思路一(哈希表+stringstream):
- 代码实现
- 代码实现(思路一(哈希表+stringstream)):
- 部分代码解读
时间限制: 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 中,输出 0if (!delayed.count(var) && !variables.count(var)) {cout << 0 << endl;continue;}// 如果变量在 delayed 中,先计算其值并存入 variablesif (delayed.count(var)) {string expr = delayed[var];string value = evaluate_expression(expr, variables);variables[var] = value;}// 输出变量的值的长度,取模 1000000007string 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;}
欢迎大家和我沟通交流(✿◠‿◠)