使用两个队列实现一个栈
StackByQueue.h
typedef int SQDataType;
typedef struct StackByQueue
{
Queue q1;
Queue q2;
}StackByQueue;
void InitStackByQueue(StackByQueue* s);
void PushStackByQueue(StackByQueue* s, SQDataType data);
int StackByQueueEmpty(StackByQueue* s);
void PopStackByQueue(StackByQueue* s);
SQDataType TopStackByQueue(StackByQueue* s);
int SizeStackByQueue(StackByQueue* s);
void DestroyStackByQueue(StackByQueue* s);
StackByQueue.c
void InitStackByQueue(StackByQueue* s)
{
QueueInit(&s->q1);
QueueInit(&s->q2);
}
void PushStackByQueue(StackByQueue* s, SQDataType data)
{
//先判断哪个队列不为空,放到该队列,第一个元素在q2
if (!QueueEmpty(&s->q1))
{
QueuePush(&s->q1, data);
}
else
{
QueuePush(&s->q2, data);
}
}
int StackByQueueEmpty(StackByQueue* s)
{
return QueueEmpty(&s->q1) && QueueEmpty(&s->q2);
}
void PopStackByQueue(StackByQueue* s)
{
if (StackByQueueEmpty(s))
{
return;
}
//当第q1的元素为空,把q2的前size - 1个元素倒入q1
if (QueueEmpty(&s->q1))
{
while (QueueSize(&s->q2) > 1)
{
QueuePush(&s->q1, QueueFront(&s->q2));
QueuePop(&s->q2);
}
QueuePop(&s->q2); //移除队列2最后一个元素
}
else //q2为空
{
while (QueueSize(&s->q1) > 1)
{
QueuePush(&s->q2, QueueFront(&s->q1));
QueuePop(&s->q1);
}
QueuePop(&s->q1);
}
}
SQDataType TopStackByQueue(StackByQueue* s)
{
if (!QueueEmpty(&s->q1))
{
return QueueBack(&s->q1);
}
else
{
return QueueBack(&s->q2);
}
}
int SizeStackByQueue(StackByQueue* s)
{
return QueueSize(&s->q1) + QueueSize(&s->q2);
}
void DestroyStackByQueue(StackByQueue* s)
{
QueueDestroy(&s->q1);
QueueDestroy(&s->q2);
}
void TestStackByQueue()
{
StackByQueue s;
InitStackByQueue(&s);
PushStackByQueue(&s, 1);
PushStackByQueue(&s, 2);
PushStackByQueue(&s, 3);
PushStackByQueue(&s, 4);
printf("****************push************************\n");
printf("size = %d\n", SizeStackByQueue(&s));
printf("top = %d\n", TopStackByQueue(&s));
PushStackByQueue(&s, 1);
PushStackByQueue(&s, 2);
PushStackByQueue(&s, 3);
PushStackByQueue(&s, 4);
printf("****************push************************\n");
printf("size = %d\n", SizeStackByQueue(&s));
printf("top = %d\n", TopStackByQueue(&s));
PopStackByQueue(&s);
printf("****************pop************************\n");
printf("size = %d\n", SizeStackByQueue(&s));
printf("top = %d\n", TopStackByQueue(&s));
}