使用两个栈实现一个队列
QueueByStack.h
typedef int SQDataType;
typedef struct QueueByStack
{
Stack _s1;
Stack _s2;
}QueueByStack;
void InitQueueByStack(QueueByStack* q);
void PushQueueByStack(QueueByStack* q, SQDataType data);
void PopQueueByStack(QueueByStack* q);
void PQueueByStack(QueueByStack* q);
int QueueByStackEmpty(QueueByStack* q);
int SizeQueueByStack(QueueByStack* q);
SQDataType HeadQueueByStack(QueueByStack* q);
SQDataType TailQueueByStack(QueueByStack* q);
QueueByStack.
void InitQueueByStack(QueueByStack* q)
{
InitStack(&q->_s1);
InitStack(&q->_s2);
}
void PushQueueByStack(QueueByStack* q, SQDataType data)
{
PushStack(&q->_s1, data); //s1负责入队列
}
int QueueByStackEmpty(QueueByStack* q)
{
return StackEmpty(&q->_s1) && StackEmpty(&q->_s2);
}
void PopQueueByStack(QueueByStack* q) //s2负责出队列
{
if (QueueByStackEmpty(q))
{
printf("kong\n");
return;
}
if (StackEmpty(&q->_s2)) //出队列的栈为空
{
while (!StackEmpty(&q->_s1))
{
PushStack(&q->_s2, TopStack(&q->_s1));
PopStack(&q->_s1);
}
}
PopStack(&q->_s2);
}
int SizeQueueByStack(QueueByStack* q)
{
return SizeStack(&q->_s1) + SizeStack(&q->_s2);
}
SQDataType HeadQueueByStack(QueueByStack* q) //队头在s2中取得
{
if (QueueByStackEmpty(q))
{
printf("kong\n");
return 0;
}
if (StackEmpty(&q->_s2)) //出队列的栈为空
{
while(!StackEmpty(&q->_s1)) //将s1的元素搬移到s2
{
PushStack(&q->_s2, TopStack(&q->_s1));
PopStack(&q->_s1);
}
}
return TopStack(&q->_s2);
}
SQDataType TailQueueByStack(QueueByStack* q) //队尾 在s1中取得
{
if (QueueByStackEmpty(q))
{
printf("kong\n");
return 0;
}
if (StackEmpty(&q->_s1))
{
while (!StackEmpty(&q->_s2))
{
PushStack(&q->_s1, TopStack(&q->_s2));
PopStack(&q->_s2);
}
}
return TopStack(&q->_s1);
}
void TestQueueByStack()
{
QueueByStack q;
InitQueueByStack(&q);
PushQueueByStack(&q, 1);
PushQueueByStack(&q, 2);
PushQueueByStack(&q, 3);
PushQueueByStack(&q, 4);
PushQueueByStack(&q, 5);
printf("size = %d\n", SizeQueueByStack(&q));
printf("head = %d\n", HeadQueueByStack(&q));
printf("tail = %d\n", TailQueueByStack(&q));
PopQueueByStack(&q);
printf("size = %d\n", SizeQueueByStack(&q));
printf("head = %d\n", HeadQueueByStack(&q));
printf("tail = %d\n", TailQueueByStack(&q));
PopQueueByStack(&q);
PopQueueByStack(&q);
PopQueueByStack(&q);
PopQueueByStack(&q);
printf("size = %d\n", SizeQueueByStack(&q));
printf("head = %d\n", HeadQueueByStack(&q));
printf("tail = %d\n", TailQueueByStack(&q));
}