CCF CSP 第37次(2025.03)(3_模板展开_C++)(哈希表+stringstream)

发布于:2025-06-04 ⋅ 阅读:(32) ⋅ 点赞:(0)

时间限制: 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;

}

欢迎大家和我沟通交流(✿◠‿◠)


网站公告

今日签到

点亮在社区的每一天
去签到