【栈和队列面试题】两个队列实现一个栈

 分析:

 将queue1用作进栈出栈,queue2作为一个中转站

入栈时,直接压入q1中

出栈时,先将q1中的元素除最后一个元素外依次出队列,并压入队列q2中,将留在q1中的最后一个元素出队列即为出栈元素,最后还要把q2中的元素再次压入q1中

//QStank.h
#pragma once
#include "Queue.h"
//两个队列实现一个栈
typedef  struct QStack {
	Queue q1;
	Queue q2;
}QStack;

void QStackInit(QStack* pQS);
void QStackDestroy(QStack* pQS);
void QStackPush(QStack* pQS, QDataType data);
void QStackPop(QStack* pQS);
QDataType QStackTop(QStack* pQS);
void TestQStack();
//QStack.c
#include "QStack.h"
#include "Queue.h"
void QStackInit(QStack* pQS)
{
	QueueInit(&pQS->q1);
	QueueInit(&pQS->q2);
}
void QStackDestroy(QStack* pQS)
{
	QueueDestroy(&pQS->q1);
	QueueDestroy(&pQS->q2);
}
void QStackPush(QStack* pQS, QDataType data)
{
	QueuePush(&(pQS->q1), data);
}
void QStackPop(QStack* pQS)
{
	Queue *pEmpty = &(pQS->q1);
	Queue *pNotEmpty = &(pQS->q2);
	if (QueueEmpty(pNotEmpty)) {
		pEmpty =&(pQS->q2);
		pNotEmpty = &(pQS->q1);
	}
	while (QueueSize(pNotEmpty) > 1) {
		QDataType q1 = QueueFront(pNotEmpty);
		QueuePush(pEmpty, q1);
		QueuePop(pNotEmpty);
	}
	QueuePop(pNotEmpty);
}
QDataType QStackTop(QStack* pQS)
{
	Queue *pEmpty = &(pQS->q1);
	Queue *pNotEmpty = &(pQS->q2);
	if (QueueEmpty(pNotEmpty)) {
		pEmpty = &(pQS->q2);
		pNotEmpty = &(pQS->q1);
	}
	while (QueueSize(pNotEmpty) > 1) {
		QDataType q1 = QueueFront(pNotEmpty);
		QueuePush(pEmpty, q1);
		QueuePop(pNotEmpty);
	}
	return QueueFront(pNotEmpty);
}

void TestQStack()
{
	/*
	QStack	*stack;	// 指针 vs 指针指向的空间	(野指针)
	QSInit(stack);
	*/

	QStack	stack;
	QStackInit(&stack);

	for (int i = 0; i < 5; i++) {
		QStackPush(&stack, i);
		printf("压入了 %d, Top = %d\n", i, QStackTop(&stack));
	}

	for (int i = 0; i < 3; i++) {
		QStackPop(&stack);
		printf("Top = %d\n", QStackTop(&stack));
	}

	for (int i = 0; i < 2; i++) {
		QStackPush(&stack, i + 10);
		printf("压入了 %d, Top = %d\n", i + 10, QStackTop(&stack));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值