StackByTwoQueue.h
#pragma once
#include "Queue.h"
#include "Stack.h"
typedef struct StackByTwoQueue
{
Queue q1;
Queue q2;
}StackByTwoQueue;
void StackByTwoQueueInit(StackByTwoQueue* stq);
void StackByTwoQueueDestory(StackByTwoQueue* stq);
void StackByTwoQueuePush(StackByTwoQueue* stq, DataType x);
void StackByTwoQueuePop(StackByTwoQueue* stq);
DataType StackByTwoQueueTop(StackByTwoQueue* stq);
int StackByTwoQueueEmpty(StackByTwoQueue* stq);
int StackByTwoQueueSize(StackByTwoQueue* stq);
StackByTwoQueue.c
#include "Topic2.h"
void StackByTwoQueueInit(StackByTwoQueue * stq)
{
assert(stq);
QueueInit(&stq->q1);
QueueInit(&stq->q2);
}
void StackByTwoQueueDestory(StackByTwoQueue * stq)
{
assert(stq);
QueueDestory(&stq->q1);
QueueDestory(&stq->q2);
}
void StackByTwoQueuePush(StackByTwoQueue * stq, DataType x)
{
assert(stq);
if (QueueEmpty(&stq->q1))
{
QueuePush(&stq->q1, x);
}
else
{
QueuePush(&stq->q2, x);
}
}
void StackByTwoQueuePop(StackByTwoQueue * stq)
{
assert(stq);
Queue *empty = &stq->q1;
Queue *nonempty = &stq->q2;
if (QueueEmpty(&stq->q1))
{
empty = &stq->q2;
nonempty = &stq->q1;
}
else
{
while (QueueSize(&stq->q2) > 1)
{
QueuePush(empty, QueueFront(nonempty));
QueuePop(nonempty);
}
QueuePop(nonempty);
}
}
DataType StackByTwoQueueTop(StackByTwoQueue * stq)
{
assert(stq);
if (QueueEmpty(&stq->q1))
{
return QueueBack(&stq->q1);
}
else
{
return QueueBack(&stq->q2);
}
}
int StackByTwoQueueEmpty(StackByTwoQueue * stq)
{
assert(stq);
return QueueEmpty(&stq->q1) | QueueEmpty(&stq->q2);
}
int StackByTwoQueueSize(StackByTwoQueue * stq)
{
assert(stq);
return QueueSize(&stq->q1) + QueueSize(&stq->q2);
}