两个栈实现一个队列
1.主要思想
栈的特点:先进后出。队列的特点:先进先出。
我们在用两个队列实现栈的时候是用顺序队列。
2.结构设计
既然是用两个队列实现栈的操作,所以定义的结构体中的成员就是两个队列。
typedef struct
{
SqQueue q1;
SqQueue q2;
}TQStack, *PTQStack;
3.基本操作
- 我们要实现的是一个栈,所以所有的操作都是基于栈的基础上,栈有什么操作,我们实现的就有什么操作。
- 我们用两个队列实现栈的操作中,队列的所有操作是给定的,在我们实现栈的过程中,只需要调用其函数即可(见顺序队列)。
(1)初始化
void my_InitStack(PTQStack ptq)
{
assert(ptq != NULL);
if (ptq == NULL)return;
Init_Queue(&ptq->q1);
Init_Queue(&ptq->q2);
}
(2)入栈
哪个队列不空就入哪个队列。
bool my_Push(PTQStack ptq, int val)
{
assert(ptq != NULL);
if (ptq == NULL)return false;
if (!IsEmpty(&ptq->q1))
{
return Push(&ptq->q1,val);
}
else
{
return Push(&ptq->q2, val);
}
}
(3)获取栈顶第一个元素的值,但不删除
栈顶的元素就是队列尾的元素,要将队列尾部的元素得到,就需要将其他元素一次存放进另一个队列中保存。
bool my_GetTop(PTQStack ptq, int* rtval)
{
assert(ptq != NULL && rtval != NULL);
if (ptq == NULL || rtval == NULL)return false;
if (!IsEmpty(&ptq->q1))//如果q1不空,就将q1中的元素只留一个,其他的都存入q2中。最后一个数就是栈顶元素;
{
while (Get_length(&ptq->q1) > 1)
{
int tmp = 0;
Pop(&ptq->q1, &tmp);
Push(&ptq->q2, tmp);
}
return Get_top(&ptq->q1, rtval);
}
else
{
while (Get_length(&ptq->q2) > 1)
{
int tmp = 0;
Pop(&ptq->q2, &tmp);
Push