佇列實現棧
阿新 • • 發佈:2018-11-15
利用兩個佇列實現一個棧
要求:
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);
}
}