s1和s2分别是两个栈,用两个栈实现一个队列的规则如下:
如何入队: 入队只向s1里面入队
如何出队: 看s2里面有没有值,有的话,直接出即可
s2里面没有值,为空怎么办?
将s1里面的值,全部颠倒存放到s2,这时候s2就不空了,则直接出即可
这里需要函数调函数,所以需要栈能够实现的相关函数,这里把链接如下,需要结合一起看。
(35条消息) 数据结构——栈(顺序栈)_张淑芬~的博客-CSDN博客
用两个栈模拟实现的队列的结构体设计:
//用两个栈模拟实现的队列的结构体
typedef struct Two_stack_queue
{
struct Stack s1;//这里的Stack是顺序栈
struct Stack s2;
}Two_stack_queue, * PTwo_stack_queue;
可执行函数声明:
//初始化
void my_Init_2stack_queue(struct Two_stack_queue* tsq);
//入队
bool my_Push(PTwo_stack_queue tsq, ELEM_TYPE val);
//出队(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Pop(PTwo_stack_queue tsq, ELEM_TYPE* rtval);
//获取队头元素值(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Top(PTwo_stack_queue tsq, ELEM_TYPE* rtval);
//判空
bool my_IsEmpty(PTwo_stack_queue tsq);
//有效元素个数
int my_Get_length(PTwo_stack_queue tsq);
//打印
void my_Show(PTwo_stack_queue tsq);
//清空
void my_Clear(PTwo_stack_queue tsq);
//销毁
void my_Destroy(PTwo_stack_queue tsq);
初始化;
//初始化
void my_Init_2stack_queue(struct Two_stack_queue* tsq)
{
assert(tsq != NULL);
Init_Stack(&tsq->s1);//直接调用s1和s2自身的初始化函数即可
Init_Stack(&tsq->s2);
}
入队,出队
//入队
bool my_Push(PTwo_stack_queue tsq, ELEM_TYPE val)
{
assert(tsq != NULL);
return Push(&tsq->s1, val);//调用栈吱声的入队函数
}
//出队(还需要一个输出参数,帮助我将出队的值带出来)
//从s2出,如果s2不空,直接出,
//如果s2空,先将s1的数据全部颠倒存放到s2里,这时s2就不空了
bool my_Pop(PTwo_stack_queue tsq, ELEM_TYPE* rtval)
{
assert(tsq != NULL);
if (my_IsEmpty(tsq))//证明模拟实现的队列里有数据,在哪不确定
{
return false;
}
if (IsEmpty(&tsq->s2))//确定了数据在s1里
{
ELEM_TYPE tmp;
while (!IsEmpty(&tsq->s1))//只要s1里面还有值 就取出来放到s2里面
{
Pop(&tsq->s1, &tmp);
Push(&tsq->s2, tmp);
}
return Pop(&tsq->s2, rtval);
}
else//如果s2不空 直接出值
{
return Pop(&tsq->s2, rtval);
}
}
获取队头元素值(还需要一个输出参数,帮助我将出队的值带出来)
//获取队头元素值(还需要一个输出参数,帮助我将出队的值带出来)
bool my_Top(PTwo_stack_queue tsq, ELEM_TYPE* rtval)
{
assert(tsq != NULL);
if (my_IsEmpty(tsq))//证明模拟实现的队列里有数据,在哪不确定
{
return false;
}
if (IsEmpty(&tsq->s2))
{
ELEM_TYPE tmp;
while (!IsEmpty(&tsq->s1))//只要s1里面还有值 就取出来放到s2里面
{
Pop(&tsq->s1, &tmp);
Push(&tsq->s2, tmp);
}
return Top(&tsq->s2, rtval);
}
else
{
return Top(&tsq->s2, rtval);
}
}
判空,有效元素个数
//判空
bool my_IsEmpty(PTwo_stack_queue tsq)
{
assert(tsq != NULL);
if (IsEmpty(&tsq->s1) && IsEmpty(&tsq->s2))
{
return true;
}
return false;
}
//有效元素个数
int my_Get_length(PTwo_stack_queue tsq)
{
assert(tsq != NULL);
return Get_length(&tsq->s1)+Get_length(&tsq->s2);
}
打印,清空,销毁
//打印
void my_Show(PTwo_stack_queue tsq)
{
assert(tsq != NULL);
//先s2 后s1
//s2从上到下打印 s1从下到上
int len = Get_length(&tsq->s2);
for (int i = len - 1; i >= 0; i--)
{
printf("%d ", tsq->s2.base[i]);
}
Show(&tsq->s1);
}
//清空
void my_Clear(PTwo_stack_queue tsq)
{
assert(tsq != NULL);
Clear(&tsq->s1);
Clear(&tsq->s2);
}
//销毁
void my_Destroy(PTwo_stack_queue tsq)
{
assert(tsq != NULL);
Destroy(&tsq->s1);
Destroy(&tsq->s2);
}