代码如下:
#include<iostream>
#include<sstream>
#include<list>
#include<stack>
#include<string>
using namespace std;
int compare(char c)
{
if(c == '+' || c == '-') return 1;
else if(c == 'x' || c == '/') return 2;
else return 0;
}
list<char> getPost(char exp[])
{
list<char> list;
stack<char> stack;
char temp;
for(int i=1;i<=7;i++)
{
temp=exp[i];
if(temp>='0'&&temp<='9')
{
list.push_back(temp);
}
else if(temp=='+'||temp=='-'||temp=='x'||temp=='/')
{
while(!stack.empty())
{
if(compare(stack.top())>=compare(temp))
{
list.push_back(stack.top());
stack.pop();
}
else break;
}
stack.push(temp);
}
else if(temp=='(')
{
stack.push(temp);
}
else
{
while(stack.top()!='(')
{
list.push_back(stack.top());
stack.pop();
}
stack.pop();
}
}
while(!stack.empty())
{
list.push_back(stack.top());
stack.pop();
}
return list;
}
int getResult(list<char> post)
{
int result;
stack<string> stack;
list<char>::iterator it;
char temp;
for(it=post.begin();it!=post.end();++it)
{
temp=*it;
if(temp>='0'&&temp<='9')
{
stringstream ss;
string str;
ss<<(temp-48);
ss>>str;
stack.push(str);
}
else
{
int b;
int a;
stringstream stream1(stack.top());
stream1>>b;
stack.pop();
stringstream stream2(stack.top());
stream2>>a;
stack.pop();
if(temp=='+')
{
stringstream ss;
string str;
ss<<(a+b);
ss>>str;
stack.push(str);
} //stack.push(a+b+"");
else if(temp=='-')
{
stringstream ss;
string str;
ss<<(a-b);
ss>>str;
stack.push(str);
} //stack.push(a-b+"");
else if(temp=='x')
{
stringstream ss;
string str;
ss<<(a*b);
ss>>str;
stack.push(str);
} //stack.push(a*b+"");
else
{
stringstream ss;
string str;
ss<<(a/b);
ss>>str;
stack.push(str);
} //stack.push(a/b+"");
}
}
stringstream stream(stack.top());
stream>>result;
return result;
}
int main()
{
int n;
cin>>n;
char exp[8];
while(n-->0)
{
for(int i=1;i<=7;i++)
cin>>exp[i];
list<char> post=getPost(exp);
int result=getResult(post);
if(result==24) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
注意事项:注意区分栈(stack)操作在Java与C++的不同之处;C++中字符串不能直接连接后压入栈;使用stringstream来进行数据类型之间的转换。