1、结构体设计
//用两个队列模拟实现的栈的结构体声明typedef struct Two_queue_stack
{struct LQueue q1;struct LQueue q2;
}Two_queue_stack, *PTwo_queue_stack;
2、可操作函数
(1)初始化
//初始化
void my_Init_two_queue_stack(struct Two_queue_stack* tqs)
{Init_LQueue(&tqs->q1);Init_LQueue(&tqs->q2);
}
(2)入栈
//入栈
bool my_Push(PTwo_queue_stack tqs, ELEM_TYPE val)
{return Push(&tqs->q2, val);
}
(3)出栈
//出栈(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Pop(PTwo_queue_stack tqs, ELEM_TYPE * rtval)
{//assertif(my_IsEmpty(tqs))//确保了自己模拟实现的这个栈里面一定有值,要么在左边,要么在右{return false;}if(!IsEmpty(&tqs->q2))//q2不空 直接出(仅剩下一个元素,其他的全部挪到另一边){int len = Get_length(&tqs->q2);while(len>1){ELEM_TYPE tmp;Pop(&tqs->q2, &tmp);Push(&tqs->q1, tmp);len--;}return Pop(&tqs->q2, rtval);}else//q2为空 确定值都在q1里面{int len = Get_length(&tqs->q1);while(len>1){ELEM_TYPE tmp;Pop(&tqs->q1, &tmp);Push(&tqs->q2, tmp);len--;}return Pop(&tqs->q1, rtval);}}
(3)获取栈顶元素
//获取栈顶元素值(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Top(PTwo_queue_stack tqs, ELEM_TYPE * rtval)
{//assertif(my_IsEmpty(tqs))//确保了自己模拟实现的这个栈里面一定有值,要么在左边,要么在右{return false;}if(!IsEmpty(&tqs->q2))//q2不空 直接出(仅剩下一个元素,其他的全部挪到另一边){int len = Get_length(&tqs->q2);while(len>1){ELEM_TYPE tmp;Pop(&tqs->q2, &tmp);Push(&tqs->q1, tmp);len--;}Pop(&tqs->q2, rtval);Push(&tqs->q1, *rtval);return true;}else//q2为空 确定值都在q1里面{int len = Get_length(&tqs->q1);while(len>1){ELEM_TYPE tmp;Pop(&tqs->q1, &tmp);Push(&tqs->q2, tmp);len--;}Pop(&tqs->q1, rtval);//出栈顶元素Push(&tqs->q2, *rtval);//最后把栈顶元素放入,保证栈数据的完整return true;}
}
(4) 判空、获取有效长度、打印、清空、销毁
//判空
bool my_IsEmpty(PTwo_queue_stack tqs)
{if(IsEmpty(&tqs->q1) && IsEmpty(&tqs->q2)){return true;}return false;
}//有效元素个数
int my_Get_length(PTwo_queue_stack tqs)
{return Get_length(&tqs->q1) + Get_length(&tqs->q2);
}//打印
void my_Show(PTwo_queue_stack tqs)
{Show(&tqs->q1);Show(&tqs->q2);
}//清空
void my_Clear(PTwo_queue_stack tqs)
{Clear(&tqs->q1);Clear(&tqs->q2);
}//销毁
void my_Destroy(PTwo_queue_stack tqs)
{Destroy(&tqs->q1);Destroy(&tqs->q2);
}
3、主函数用例测试
//两个队列模拟实现一个栈的测试用例
int main()
{struct Two_queue_stack head;my_Init_two_queue_stack(&head);for(int i=1; i<=3; i++) {my_Push(&head, i);}my_Show(&head);ELEM_TYPE flag;bool tag = my_Pop(&head, &flag);if(tag){printf("Pop = %d\n", flag);}my_Show(&head);for(int i=4; i<=6; i++) {my_Push(&head, i);}my_Show(&head);my_Pop(&head, &flag);printf("Pop = %d\n", flag);my_Pop(&head, &flag);printf("Pop = %d\n", flag);my_Pop(&head, &flag);printf("Pop = %d\n", flag);my_Pop(&head, &flag);printf("Pop = %d\n", flag);printf("length = %d\n", my_Get_length(&head));my_Top(&head, &flag);printf("Top = %d\n", flag);printf("length = %d\n", my_Get_length(&head));my_Destroy(&head);return 0;
}