1. 程式人生 > >佇列實現棧

佇列實現棧

利用兩個佇列實現一個棧

要求:
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);
	}

	
}