版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/89188626
欢迎访问我的CCF认证考试题解目录哦 https://blog.csdn.net/richenyunqi/article/details/83385502
题目描述
算法设计
这是一道求解四则表达式结果的题目。由于只涉及到四则表达式运算符,只有两个优先级,可以进行两次遍历,第一次先求解出所有乘除法的结果,第二次遍历求解出所有加减法的结果。为此,可以定义两个队列:
queue<int>num
:存储加减法的操作数和乘除法的结果queue<char>op
:存储+
、-
符号
第一次遍历整个表达式,将加减法的操作数和加减号存储起来,第二次同时遍历两个队列,求解出最终结果。为了编码方便,可以在每一个表达式的末尾添加上+0
字符,最终结果不变,但是编码会方便很多。具体实现可见代码。
C++代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string s;
cin>>n;
queue<int>num;//存储加减法的操作数和乘除法的结果
queue<char>op;//存储+、-符号
while(n--){
cin>>s;
s.push_back('+');//在每个表达式末尾加上"+"字符
for(int i=1;i<s.size();i+=2){//遍历整个字符串
int t=s[i-1]-'0';
for(;i<s.size()&&s[i]=='x'||s[i]=='/';i+=2){//求出连续乘除运算的结果
t=(s[i]=='x')?t*(s[i+1]-'0'):t/(s[i+1]-'0');
}
num.push(t);
op.push(s[i]);
}
num.push(0);//加减法操作数再放入一个0,保证在整个表达式末尾添上了+0运算
int t=num.front();//第一个加减法操作数
num.pop();
while(!op.empty()){//同时遍历两个队列,求出加减运算的结果
char c=op.front();
op.pop();
t=(c=='+')?t+num.front():t-num.front();
num.pop();
}
puts(t==24?"Yes":"No");
}
return 0;
}