题目来源于CCF CSP
思路解析
这道题目和我以前数据结构作业类似,因此做的比较快,当然,这道题目的思路也比较简答,我采用的是使用vector
容器,做类似栈的处理,先将乘除法运算,然后再次计算加减即可完成任务。
代码解析
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string Value(string str, int& i)
{
string num = "";
for (; i < str.size(); ++i) {
if (str[i] - '0' <= 9 && str[i] - '0' >= 0)
num += str[i];
else
break;
}
return num;
}
bool Check(string str)
{
int i = 0;
vector<string> temp_str;
temp_str.push_back(Value(str, i)); //装入第一个数
temp_str.push_back(string(1, str[i++]));//装入第一个符号
//消除乘除
while (i < str.size()) {
if (temp_str.back() == "+" || temp_str.back() == "-") //当栈顶为加或者减时,放入下一个数
{
temp_str.push_back(Value(str, i));
if (i < str.size())
temp_str.push_back(string(1, str[i++])); //装入下一个符号
}
else { //符号为"x"或者"/" 时
string late_num = Value(str, i); //后一个数
string Char = temp_str.back(); //运算符
temp_str.pop_back(); //弹出运算符
string pre_num = temp_str.back(); ///前一个数
temp_str.pop_back(); //弹出参加计算的数
int num = 0;
if (Char == "x") {
num = stoi(late_num.c_str()) * stoi(pre_num.c_str());
}
else {
num = stoi(pre_num.c_str()) / stoi(late_num.c_str());
}
string new_num_str = to_string(num);
temp_str.push_back(new_num_str); //将计算结果重新放入栈中
if(i < str.size())
temp_str.push_back(string(1, str[i++])); //装入下一个符号
}
}
//消除加减
string num_str = ""; //数值
string Char = ""; //符号
int num = 0;
for (int i = 0; i < temp_str.size(); ++i) {
if (i == 0)
num += stoi(temp_str[i]);
else {
if (temp_str[i] == "+" || temp_str[i] == "-")
Char = temp_str[i];
else {
if (Char == "+") {
num += stoi(temp_str[i]);
}
else if (Char == "-") {
num -= stoi(temp_str[i]);
}
}
}
}
if (num == 24)
return true;
return false;
}
int main()
{
int n;
cin >> n;
string str = "";
for (int i = 0; i < n; ++i) {
cin >> str;
if (Check(str))
cout << "Yes" << endl;
else
cout << "No" << endl;
str = "";
}
return 0;
}
测试结果