题目:
思路:
怎么保存、传递临时改变的栈-用临时栈(三维,第三个作为栈顶指针?)
怎么存储不同操作的过程-都存在栈中-还是放在结构体里
为每个temp存储指针-还是用二维数组存
操作次数通过fa指针最后计算
怎么存储遍历队列,如果只存栈不存node可不可以-直接用node指针
决定用结构体
暂缓:Vis要考虑栈顶指针吗,怎么比较呢,同时栈顶指针是否相等vis[MAX][MAX][2],( 0存栈顶指针,1存标识)-如果栈中数字一样,栈顶指针不一样就是两个不同的栈怎么办-只考虑栈顶两个元素是否合理,比较整个栈开销太大
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
#define OK 1
#define ERROR 0
typedef struct Node{
int stk[MAX] ;
int top;
struct Node* fa;
int lastPro;
}node;
char proName[5][4]={"add","sub","mul","div","dup"};
node* q[MAX*MAX];//遍历队列
//int vis[MAX][MAX];//栈的vis可能出现情况太复杂,暂缓
int res[MAX];//进行操作
int cnt;//操作次数
//结构操作
node* newnode(){
node* a=(node*)malloc(sizeof(node));
a->fa=NULL;
a->lastPro=-1;
memset(a->stk,0,sizeof(a->stk));
a->top=0;
return a;
}
void pushs(node* n,int a){
n->stk[n->top++]=a;
}
int pops(node* n){
int a=n->stk[n->top-1];
n->top--;
return a;
}
void print_stk(node* nd){
int n=nd->top;
while(n--){
printf("%d ",nd->stk[n]);
}
}
/*计算功能 */
int add(node* nd){
int a,b;
if(nd->top<2){
// printf("add:top<2\n");
return ERROR;
}
a=pops(nd);
b=pops(nd);
pushs(nd,a+b);
// print_stk(nd);
// printf("\n--add\n");
return OK;
}
int sub(node* nd){
int a,b;
if(nd->top<2){
return ERROR;
}
a=pops(nd);
b=pops(nd);
pushs(nd,b-a);
// print_stk(nd);
// printf("\n--sub\n");
return OK;
}
int mul(node* nd){
int a,b;
if(nd->top<2){
return ERROR;
}
a=pops(nd);
b=pops(nd);
pushs(nd,b*a);
// print_stk(nd);
// printf("\n--mul\n");
return OK;
}
int div(node* nd){
int a,b;
if(nd->top<2||nd->stk[nd->top-1]==0){
return ERROR;
}
a=pops(nd);
b=pops(nd);
pushs(nd,(int)(b/a));
// print_stk(nd);
// printf("\n--div\n");
return OK;
}
int dup(node* nd){
if(nd->top<1){
// printf("dup:top<1\n");
return ERROR;
}
int a=nd->stk[nd->top-1];
pushs(nd,a);
// print_stk(nd);
// printf("\n--dup\n");
return OK;
}
node* pro(node* fa_nd,int i){
int flag;
node* res_nd=newnode();
memcpy(res_nd,fa_nd,sizeof(*fa_nd));//mark或node
res_nd->fa=fa_nd;
switch(i){
case 0:{
flag=add(res_nd);
break;
}
case 1:{
flag=sub(res_nd);
break;
}
case 2:{
flag=mul(res_nd);
break;
}
case 3:{
flag=div(res_nd);
break;
}
case 4:{
flag=dup(res_nd);
break;
}
}
if(flag){
res_nd->lastPro=i;
return res_nd;
}else{
return NULL;
}
}
node* bfs(int a,int end){
int front=0,rear=0;
node* temp=newnode();
node* res;
pushs(temp,a);
// vis[a]=1;
q[rear++]=temp;//pushq
while(front<rear){
temp=q[front++];//popq
if(temp->stk[temp->top-1]==end){
// print_stk(temp);
return temp;
}
for(int i=0;i<5;i++){
res=pro(temp,i);
if(res!=NULL){
q[rear++]=res;
// vis
}
}
}
return NULL;
}
void print_res(node* nd){
if(nd->lastPro!=-1)res[cnt++]=nd->lastPro;
if(nd->fa!=NULL)print_res(nd->fa);
else{
while(cnt--){
printf("%s ",proName[res[cnt]]);
}
}
}
int main(){
int a,b;
node* res_nd;
while(scanf("%d%d",&a,&b)==2){
memset(q,NULL,sizeof(q));
cnt=0;
res_nd=bfs(a,b);
if(res_nd!=NULL)print_res(res_nd);
}
return 0;
}