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;}
歡迎大家和我溝通交流(????)