#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int priority(char op){
return op=='+'||op=='-'?0:1;
}
int compareOp(char op1,char op2){
return priority(op1)-priority(op2);
}
int deal(int a,int b,char op){
int r;
switch(op){
case '+':r=a+b;break;
case '-':r=a-b;break;
case 'x':r=a*b;break;
case '/':r=a/b;break;
}
//cout<<"计算"<<a<<op<<b<<"="<<r<<endl;
return r;
}
int calc(int num[],char op[]){
stack<int> datas;
stack<char> ops;
datas.push(num[0]);
ops.push(op[0]);
datas.push(num[1]);
if(compareOp(op[1],ops.top())>0){
int n=datas.top();
datas.pop();
datas.push(deal(n,num[2],op[1]));
}else{
int n1=datas.top();
datas.pop();
int n2=datas.top();
datas.pop();
char opv=ops.top();
ops.pop();
datas.push(deal(n2,n1,opv));
ops.push(op[1]);
datas.push(num[2]);
}
if(compareOp(op[2],ops.top())>0){
int n=datas.top();
datas.pop();
datas.push(deal(n,num[3],op[2]));
}else{
int n1=datas.top();
datas.pop();
int n2=datas.top();
datas.pop();
char opv=ops.top();
ops.pop();
datas.push(deal(n2,n1,opv));
ops.push(op[2]);
datas.push(num[3]);
}
int n1=datas.top();
datas.pop();
int n2=datas.top();
datas.pop();
char opv=ops.top();
ops.pop();
return deal(n2,n1,opv);
}
int main()
{
int N;
char op[3];
int num[4];
//freopen("d:\\a.txt","r",stdin);
cin>>N;
for(int i=0;i<N;i++){
cin>>num[0]>>op[0]>>num[1]>>op[1]>>num[2]>>op[2]>>num[3];
int r=calc(num,op);
//cout<<num[0]<<op[0]<<num[1]<<op[1]<<num[2]<<op[2]<<num[3]<<"="<<r<<endl;
if(r==24)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
使用循环的写法:
#include <bits/stdc++.h>
using namespace std;
int priority(char op){
return op=='+'||op=='-'?0:1;
}
int compareOp(char op1,char op2){
return priority(op1)-priority(op2);
}
int deal(int a,int b,char op){
int r;
switch(op){
case '+':r=a+b;break;
case '-':r=a-b;break;
case 'x':r=a*b;break;
case '/':r=a/b;break;
}
return r;
}
int calc(int num[],char op[]){
vector<int> datas;
vector<char> ops;
int n=0;
while(n<3){
if(datas.empty()){
datas.push_back(num[n]);
ops.push_back(op[n]);
datas.push_back(num[n+1]);
}
else{
if(compareOp(op[n],ops.back())>0){
int n1=datas.back();
datas.pop_back();
datas.push_back(deal(n1,num[n+1],op[n]));
}
else{
int n1=datas.back();
datas.pop_back();
int n2=datas.back();
datas.pop_back();
char opv=ops.back();
ops.pop_back();
datas.push_back(deal(n2,n1,opv));
ops.push_back(op[n]);
datas.push_back(num[n+1]);
}
}
n++;
}
int n1=datas.back();datas.pop_back();
int n2=datas.back();datas.pop_back();
char opv=ops.back();ops.pop_back();
return deal(n2,n1,opv);
}
int main()
{
int N;
char op[3];
int num[4];
//freopen("d:\\csp\\201903-1-1.txt","r",stdin);
cin>>N;
for(int i=0;i<N;i++){
cin>>num[0]>>op[0]>>num[1]>>op[1]>>num[2]>>op[2]>>num[3];
int r=calc(num,op);
if(r==24)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}