思路:
压栈:检测那个队列有数据 —->放数据到该队列
出栈:检测哪个队列中有数据—–>将该队列中n-1个数据导入另一个队列,对这个栈第n-1个元素出栈
取栈顶:检测哪个队列中有数据—–>将该队列中n-1个数据导入另一个队列,将这个栈第n-1个元素返回,并将第n-1个元素压入另一个队列
代码:
typedef struct Queue
{
QLinkList* front;
QLinkList* rear;
int sz;
}Queue;
typedef struct StackBy2Queue
{
Queue q1;
Queue q2;
}StackBy2Queue;
void StackBy2QueueInit(StackBy2Queue* p);//初始化
void StackBy2QueuePush(StackBy2Queue* p, DataType data);//入栈
void StackBy2QueuePop(StackBy2Queue* p);//出栈
DataType StackBy2QueueTop(StackBy2Queue* p);//取栈顶元素
int StackBy2QueueSize(StackBy2Queue* Qlist);//栈大小
int StackBy2QueueEmpty(StackBy2Queue* Qlist);//是否为空
void StackBy2QueueInit(StackBy2Queue* s)
{
assert(s);
QueueInit(&s->q1);
QueueInit(&s->q2);
}
void StackBy2QueuePush(StackBy2Queue* s, DataType data)
{
assert(s);
if (QueueSize(&s->q2))
QueuePush(&s->q2, data);
else
QueuePush(&s->q1, data);
}
void StackBy2QueuePop(StackBy2Queue* s)
{
assert(s);
if (QueueSize(&s->q1))
{
while (QueueSize(&s->q1) > 1)
{
QueuePush(&s->q2, QueueFront(&s->q1));
QueuePop(&s->q1);
}
QueuePop(&s->q1);
}
else
{
while (QueueSize(&s->q2) > 1)
{
QueuePush(&s->q1, QueueFront(&s->q2));
QueuePop(&s->q2);
}
QueuePop(&s->q2);
}
}
DataType StackBy2QueueTop(StackBy2Queue* s)
{
assert(s);
if (QueueSize(&s->q1))
{
return QueueBack(&s->q1);
}
else
{
return QueueBack(&s->q2);
}
}
int StackBy2QueueSize(StackBy2Queue* s)
{
assert(s);
return QueueSize(&s->q1) + QueueSize(&s->q2);
}
int StackBy2QueueEmpty(StackBy2Queue* s)
{
assert(s);
return QueueEmpty(&s->q1) && QueueEmpty(&s->q2);
}
void test3()
{
int a = 0;
StackBy2Queue Stack;
StackBy2QueueInit(&Stack);
StackBy2QueuePush(&Stack, 1);
StackBy2QueuePush(&Stack, 2);
StackBy2QueuePush(&Stack, 3);
StackBy2QueuePush(&Stack, 4);
DataType b = StackBy2QueueTop(&Stack);
StackBy2QueuePop(&Stack);
b = StackBy2QueueTop(&Stack);
a = StackBy2QueueSize(&Stack);
a = StackBy2QueueEmpty(&Stack);
StackBy2QueuePop(&Stack);
StackBy2QueuePop(&Stack);
StackBy2QueuePop(&Stack);
StackBy2QueuePop(&Stack);
b = StackBy2QueueTop(&Stack);
a = StackBy2QueueSize(&Stack);
a = StackBy2QueueEmpty(&Stack);
}
上面代码有的队列基本函数没有给出,可以自己补充调用。