源码
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
char operations[5][4]={"ADD","SUB","MUL","DIV","DUP"};
stack<int> result;
class Node{
public:
int value;
int operation;
stack<int> NodeStack;
Node * add;
Node * sub;
Node * mul;
Node * div;
Node * dup;
Node * parent;
Node()
{
value=0;
operation=0;
add=NULL;
sub=NULL;
mul=NULL;
div=NULL;
dup=NULL;
parent=NULL;
}
Node(int a,int b)
{
value=a;
parent=NULL;
operation=b;
add=NULL;
sub=NULL;
mul=NULL;
div=NULL;
dup=NULL;
}
Node * getadd(Node * p)
{
int a,b;
Node *add=new Node();
add->parent=p;
add->NodeStack=p->NodeStack;
if(add->NodeStack.empty())
return NULL;
a=add->NodeStack.top();
add->NodeStack.pop();
if(add->NodeStack.empty())
return NULL;
b=add->NodeStack.top();
add->NodeStack.pop();
add->value=a+b;
add->operation=0;
add->NodeStack.push(add->value);
return add;
}
Node * getsub(Node * p)
{
int a,b;
Node * sub=new Node();
sub->parent=p;
sub->NodeStack=p->NodeStack;
if(sub->NodeStack.empty())
return NULL;
a=sub->NodeStack.top();
sub->NodeStack.pop();
if(sub->NodeStack.empty())
return NULL;
b=sub->NodeStack.top();
sub->NodeStack.pop();
sub->value=b-a;
sub->operation=1;
sub->NodeStack.push(sub->value);
return sub;
}
Node * getmul(Node * p)
{
int a,b;
Node * mul=new Node();
mul->parent=p;
mul->NodeStack=p->NodeStack;
if(mul->NodeStack.empty())
return NULL;
a=mul->NodeStack.top();
mul->NodeStack.pop();
if(mul->NodeStack.empty())
return NULL;
b=mul->NodeStack.top();
mul->NodeStack.pop();
mul->value=a*b;
mul->operation=2;
mul->NodeStack.push(mul->value);
return mul;
}
Node * getdiv(Node * p)
{
int a,b;
Node * div=new Node();
div->parent=p;
div->NodeStack=p->NodeStack;
if(div->NodeStack.empty())
return NULL;
a=div->NodeStack.top();
div->NodeStack.pop();
if(div->NodeStack.empty())
return NULL;
b=div->NodeStack.top();
div->NodeStack.pop();
if(a==0)
return NULL;
div->value=b/a;
div->operation=3;
div->NodeStack.push(div->value);
return div;
}
Node * getdup(Node * p)
{
int a;
Node * dup=new Node();
dup->parent=p;
dup->NodeStack=p->NodeStack;
if(dup->NodeStack.empty())
return NULL;
a=dup->NodeStack.top();
dup->NodeStack.push(a);
dup->value=a;
dup->operation=4;
return dup;
}
};
void get_res(Node * node,int b)
{
queue<Node*> q;
Node * tail;
node->NodeStack.push(node->value);
node->NodeStack.push(node->value);
Node * temp;
q.push(node);
while(!q.empty())
{
temp=q.front();
q.pop();
temp->add=temp->getadd(temp);
if(temp->add!=NULL) //加
{
if(temp->add->value==b)
{
tail=temp->add;
break;
}
else
q.push(temp->add);
}
temp->sub=temp->getsub(temp); //减
if(temp->sub!=NULL)
{
if(temp->sub->value==b)
{
tail=temp->sub;
break;
}
else
q.push(temp->sub);
}
temp->mul=temp->getmul(temp); //乘
if(temp->mul!=NULL)
{
if(temp->mul->value==b)
{
tail=temp->mul;
break;
}
else
q.push(temp->mul);
}
temp->div=temp->getdiv(temp); //除
if(temp->div!=NULL)
{
if(temp->div->value==b)
{
tail=temp->div;
break;
}
else
q.push(temp->div);
}
temp->dup=temp->getdup(temp); //double
if(temp->dup!=NULL)
{
q.push(temp->dup);
}
}
while(tail!=NULL)
{
result.push(tail->operation);
tail=tail->parent;
}
}
int main()
{
int a,b;
cin>>a>>b;
Node *myNode=new Node(a,4);
get_res(myNode,b);
while(!result.empty())
{
printf("%s ",operations[result.top()]);
result.pop();
}
return 0;
}