队列实现栈

版权声明:非商业性使用,禁止演绎,转载请保留原文链接及作者 https://blog.csdn.net/qq_39478237/article/details/83050753

利用两个队列实现一个栈

要求:
Push:往非空队列里插入(如果两个队列都是空,选第一个插入)

Pop:从非空队列中 move size - 1 个元素到 空队列中,pop 剩下的一个

Top: 从非空队列中 move size - 1 个元素到 空队列中,返回剩下的一个的值, 把剩下的一个也放入另一个队列中

实现部分

结构体定义

以下代码基于队列的基本操作Queue.h,关于Queue.h请自行在本博客中查找

#include "Queue.h"

typedef struct QStack
{
	Queue queue1;
	Queue queue2;
}QStack;

初始化

void QStackInit(QStack *pQS)
{
	QueueInit(&(pQS->queue1));
	QueueInit(&(pQS->queue2));
}

销毁

void QStackDestory(QStack *pQS)
{
	QueueDestroy(&(pQS->queue1));
	QueueDestroy(&(pQS->queue2));
}

插入

void QStackPush(QStack *pQS,QDataType data)
{
	Queue *pNotEmpty = &(pQS->queue2);

	if (QueueEmpty(pNotEmpty))		    // 如果队列二为空,则不为空的就假设为队列一,就将队列一中的插入队列二
	{
		pNotEmpty = &(pQS->queue1);		//如果队列二不为空,则直接将队列一中的插入队列二
	}
	QueuePush(pNotEmpty,data);
}

删除

void QStackPop(QStack *pQS)
{
	Queue *pEmpty = &(pQS->queue1);
	Queue *pNotEmpty = &(pQS->queue2);
	if (QueueEmpty(pNotEmpty))		 //假设队列二是空,如果队列二空,则不空的就是队列一
	{
		pEmpty = &(pQS->queue2);
		pNotEmpty = &(pQS->queue1);
	}
	
	while (QueueSize(pNotEmpty) > 1)
	{
		QDataType data = QueueFront(pNotEmpty);
		QueuePop(pNotEmpty);
		QueuePush(pEmpty,data);
	}

	QueuePop(pNotEmpty);
}

获取压入的元素

QDataType QStackTop(QStack *pQS)
{
	QDataType data;
	QDataType r;
	Queue *pEmpty = &(pQS->queue1);
	Queue *pNotEmpty = &(pQS->queue2);
	if (QueueEmpty(pNotEmpty))		 //假设队列二是空,如果队列二空,则不空的就是队列一
	{
		pEmpty = &(pQS->queue2);
		pNotEmpty = &(pQS->queue1);
	}

	while (QueueSize(pNotEmpty) > 1)
	{
		data = QueueFront(pNotEmpty);
		QueuePop(pNotEmpty);
		QueuePush(pEmpty,data);
	}

	r = QueueFront(pNotEmpty);
	QueuePop(pNotEmpty);
	QueuePush(pEmpty,r);

	return r;
}


void TestQStack()
{	
	int i = 0;
	QStack qstack;
	QStackInit(&qstack);
	
	for (i=0;i<9;i++)
	{
		QStackPush(&qstack,i);
		
		printf("压入第%d ,压入 %d\n",i+1,QStackTop(&qstack));
		printf("Top = %d ",QStackTop(&qstack));
		//QStackPop(&qstack);
	}

	
}

猜你喜欢

转载自blog.csdn.net/qq_39478237/article/details/83050753