使用两个队列实现一个栈【数据结构】

使用两个队列实现一个栈

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));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值